Windows批处理生成yyyymmdd格式日期文件名出错,求排查解决
filename-yyyymmdd.csv格式文件名失败 我正在编写一份Windows批处理文件,需要将输出文件保存至指定文件夹,期望文件名格式为:filename-yyyymmdd.csv,其中yyyymmdd代表当前日期。
我的批处理代码如下:
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。我已经查阅了相关问题但仍无法成功实现,请问我哪里出错了?
错误原因分析
你遇到的问题主要有两个核心原因:
系统区域设置导致
%date%变量格式不一致%date%变量的输出格式完全取决于Windows系统的区域语言设置,比如有些区域格式是yyyy/MM/dd,有些是dd/MM/yyyy,还有的会带有星期前缀(比如你这里的a就是星期的缩写)。你写的%date:~10,4%%date:~4,2%%date:~7,2%是针对特定格式的截取,一旦系统格式不同,就会得到错误的字符串。路径与命令的语法问题
你的cd命令缺少/d参数,无法跨驱动器切换目录;同时路径中包含空格却没有用双引号包裹,会导致命令执行失败。
解决方案:使用不受区域影响的日期获取方式
推荐使用wmic命令来获取标准化的日期格式,它不受系统区域设置影响,能稳定输出yyyyMMdd格式的日期:
修正后的批处理代码如下:
@echo off :: 切换目录时同时切换驱动器,并用双引号包裹带空格的路径 cd /d "C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn" :: 执行bcp导出,路径用双引号避免空格问题 bcp "SELECT TOP 100 * FROM xxxx.dbo.xxxxx" queryout "c:\test\csv\confirmed.csv" -t, -c -S xxxx\xxxxx -U xxx -P xxxxxxxxxx :: 使用wmic获取标准化日期,不受区域设置影响 for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a" set "mydate=%dt:~0,8%" echo %mydate% :: 复制文件时同样用双引号包裹路径 copy "c:\test\csv\confirmed.csv" "c:\test\csvwithdates\confirmed-%mydate%.csv"
代码说明:
@echo off:关闭命令行的命令回显,让输出更干净cd /d:切换目录时同时切换驱动器,避免路径切换失败wmic OS Get localdatetime /value:获取系统的本地日期时间,输出格式为LocalDateTime=20240528123456.789000+480,截取前8位就是标准的yyyyMMdd格式- 所有带空格的路径用双引号包裹:避免因空格导致命令解析错误
如果你坚持使用%date%变量,需要先在命令行输入echo %date%查看当前系统的日期输出格式,再调整截取的索引。比如如果输出是Fri 05/28/2018,那正确的截取应该是%date:~10,4%%date:~4,2%%date:~7,2%,但这种方式不具备通用性,还是推荐wmic的方法。
内容的提问来源于stack exchange,提问作者user3115933

