我正在编写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
上查看了以下问题,但我很难实现建议的答案:
Get Date in YYYYMMDD format in windows batch file
Windows batch: formatted date into variable
我做错了什么?
答案 0 :(得分:3)
动态环境变量DATE
以区域相关格式提供当前本地日期,即根据Windows区域中设置的国家/地区和已使用帐户的语言选项。维基百科文章Date format by country列出了世界各国使用的各种日期格式。
因此,有必要在命令提示符窗口echo %DATE%
中运行批处理文件时使用的帐户,并查看输出日期字符串。
输出日期是否以缩短的工作日开始,还是没有工作日的日期输出?是第一个输出日和下个月的数字还是第一个输出月和次日?月份输出是数字还是名称?是月份或月份的值是否小于10输出,前导0,所以总是有两位数或只有一位数?
一个非常常见的命令行,用于修改格式为..., DD.MM.YYYY
的区域相关日期字符串,其中.
或/
或任何其他分隔符字符为YYYYMMDD
:
set "LocalDate=%DATE:~-4%%DATE:~-7,2%%DATE:~-10,2%"
日期字符串从右边替换以使字符串替换独立于日期字符串开头的工作日的存在。
对于区域相关日期字符串..., 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%
另见What does %date:~-4,4%%date:~-10,2%%date:~-7,2%_%time:~0,2%%time:~3,2% mean?
使用动态环境变量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 的缺点是执行所需的时间,因为需要超过一秒的时间来输出日期字符串UTF-16 Little Endian编码接下来通过命令 FOR
请参阅%date% produces different result in batch file when run from Scheduled Tasks in Server 2016上的答案,详细了解这两个命令行如何在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 /?