首页 > 解决方案 > 如何将 Windows 批处理文件中的日期格式设为“yyyymmdd”?

问题描述

我正在编写一个Windows批处理文件,并且batch file应该在特定文件夹中输出一个文件。我希望文件名写成如下:

filename-yyyymmdd.csv

其中 yyyymmdd 代表当前日期。

我的batch file代码如下:

cd:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn
bcp "SELECT TOP 100 * FROM xxxx.dbo.xxxxx" queryout c:\test\csv\confirmed.csv -t, -c -S xxxx\xxxxx -U xxx -P xxxxxxxxxx
set mydate=%date:~10,4%%date:~4,2%%date:~7,2%
echo %mydate%
copy c:\test\csv\confirmed.csv c:\test\csvwithdates\confirmed-%mydate%.csv

我得到以下文件名作为输出: confirmed-ay18.csv

期望的输出:confirmed-20180528.csv

我查看了以下问题,StackOverflow但我很难实施建议的答案:

在 Windows 批处理文件中获取 YYYYMMDD 格式的日期

Windows批处理:将日期格式化为变量

我究竟做错了什么?

标签: sql-serverwindowsdatebatch-filebcp

解决方案


动态环境变量DATE以区域相关格式提供当前本地日期,即根据在 Windows 区域和所用帐户的语言选项中设置的国家/地区。Wikipedia 文章Date format by country列出了世界各国使用的各种日期格式。

因此,有必要使用在命令提示符窗口中运行批处理文件时使用的帐户运行echo %DATE%并查看输出日期字符串。

输出日期是从缩写的工作日开始还是没有工作日的日期输出?是第一个输出日期和下个月有数字还是第一个输出月份和第二天?月份输出是数字还是名称?是月份中的某天还是值小于 10 的月份输出带有前导 0,因此总是使用两位数还是只有一位数?

ddd, dd.MM.yyyy一个非常常见的命令行,用于修改带有./或任何其他分隔符的格式的区域相关日期字符串yyyyMMdd为:

set "LocalDate=%DATE:~-4%%DATE:~-7,2%%DATE:~-10,2%"

从右侧替换日期字符串以使字符串替换与日期字符串开头是否存在工作日无关。

对于区域相关的日期字符串ddd, MM/dd/yyyy,要使用的命令行是:

set "LocalDate=%DATE:~-4%%DATE:~-10,2%%DATE:~-7,2%"

通过使用命令ECHO而不是SET在命令提示符窗口中运行命令,可以轻松找出需要替换的字符串:

echo %DATE%
echo %DATE:~-4%%DATE:~-7,2%%DATE:~-10,2%
echo %DATE:~-4%%DATE:~-10,2%%DATE:~-7,2%

另见%date:~-4,4%%date:~-10,2%%date:~-7,2%_%time:~0,2%%time:~3,2% 是什么意思?

使用动态环境变量的优势在于DATE速度,因为此字符串替换由 Windows 命令处理器非常快地完成。缺点是由于地区/国家/地区的依赖性而变化的日期格式。

一个独立于区域的解决方案正在使用命令WMIC,如下所示:

for /F "tokens=2 delims==." %%I in ('%SystemRoot%\System32\wbem\wmic.exe OS GET LocalDateTime /VALUE') do set "LocalDate=%%I"
set "LocalDate=%LocalDate:~0,8%"

WMIC始终以 yyyyMMddHHmmss.microsecond±UTC 偏移量的格式输出日期字符串,以分钟为单位,与配置的国家/地区以及为该国家/地区设置的日期格式无关。

使用WMIC的缺点是执行所需的时间,因为它需要超过一秒的时间来输出由命令FOR处理的 UTF-16 Little Endian 编码的日期字符串。

请参阅为什么 %date% 在作为计划任务执行的批处理文件中产生不同结果的答案?有关这两个命令行如何通过 Windows 命令处理器执行的非常详细的解释cmd.exe

完整的批处理文件:

@echo off
cd /D "C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn"
bcp.exe "SELECT TOP 100 * FROM xxxx.dbo.xxxxx" queryout C:\test\csv\confirmed.csv -t, -c -S xxxx\xxxxx -U xxx -P xxxxxxxxxx
for /F "tokens=2 delims==." %%I in ('%SystemRoot%\System32\wbem\wmic.exe OS GET LocalDateTime /VALUE') do set "LocalDate=%%I"
set "LocalDate=%LocalDate:~0,8%"
copy /Y C:\test\csv\confirmed.csv C:\test\csvwithdates\confirmed-%LocalDate%.csv
set "LocalDate="

要了解使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

  • cd /?
  • copy /?
  • echo /?
  • for /?
  • set /?
  • wmic /?
  • wmic os /?
  • wmic os get /?
  • wmic os get localdatetime /?

推荐阅读