如何获取 Windows 批处理文件中的日期格式为“yyyymmdd”?

use*_*933 3 windows sql-server bcp date batch-file

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

filename-yyyymmdd.csv
Run Code Online (Sandbox Code Playgroud)

其中 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
Run Code Online (Sandbox Code Playgroud)

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

期望的输出: confirmed-20180528.csv

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

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

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

我究竟做错了什么?

Mof*_*ofi 6

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

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

输出日期是以缩写的工作日开头还是没有工作日的日期输出?第一个输出日期和下个月是数字还是第一个输出月份和第二天?月份输出是数字还是名称?是月中的某天还是值小于 10 的月份输出前导 0,所以总是两位数还是一位数?

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

set "LocalDate=%DATE:~-4%%DATE:~-7,2%%DATE:~-10,2%"
Run Code Online (Sandbox Code Playgroud)

日期字符串从右侧替换,以使字符串替换独立于日期字符串开头是否存在工作日。

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

set "LocalDate=%DATE:~-4%%DATE:~-10,2%%DATE:~-7,2%"
Run Code Online (Sandbox Code Playgroud)

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

echo %DATE%
echo %DATE:~-4%%DATE:~-7,2%%DATE:~-10,2%
echo %DATE:~-4%%DATE:~-10,2%%DATE:~-7,2%
Run Code Online (Sandbox Code Playgroud)

另请参阅%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%"
Run Code Online (Sandbox Code Playgroud)

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="
Run Code Online (Sandbox Code Playgroud)

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

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