【问题标题】:How to get the date format in windows batch file as 'yyyymmdd'?如何将 Windows 批处理文件中的日期格式设为“yyyymmdd”?
【发布时间】:2018-11-07 01:07:34
【问题描述】:

我正在编写一个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

我做错了什么?

【问题讨论】:

  • 为什么要使用旧的 CMD(20 岁以上)批处理语法而不是 Powershell ? Powershell 是所有 Microsoft Server 产品的主要脚本接口。您可以使用sqlserver package 中的例如Invoke-SqlCmd 来查询、格式化和导出数据。
  • 已有 20 年历史的 cmd 语法从未用于执行复杂的字符串格式化。另一方面,Powershell 中的字符串格式化可以使用与 .NET 相同的格式化字符串、方法,使字符串操作变得更容易很多。例如 (get-date).ToString('yyyyMMdd') 返回 20180528(get-date).ToString('o') 以获得完整的 ISO8601 格式
  • 您不应该尝试从%date% 获取任何数据,因为它取决于区域设置,并且可能因系统而异,甚至因用户而异。请改用here 中的一种方法。
  • 从未尝试过 Powershell。谢谢你的链接。我将通过它,它似乎非常适合 sql 查询。
  • 我认为没有必要争论哪种方法获取日期更好,尤其是当它只是为了获取文件名的日期时。

标签: sql-server windows date batch-file bcp


【解决方案1】:

动态环境变量DATE 以区域相关格式提供当前本地日期,即根据 Windows 区域和所用帐户的语言选项中设置的国家/地区。维基百科文章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%

另见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 的缺点是执行所需的时间,因为它需要超过一秒的时间来输出由命令 FOR处理的 UTF-16 Little Endian 编码的日期字符串>.

请参阅Why does %date% produce a different result in batch file executed as scheduled task? 上的答案,以获得关于这两个命令行如何在 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 /?

【讨论】:

  • +1,特别是,但不仅限于current local date in region dependent format - 大多数人很容易忽略这一事实。
猜你喜欢
  • 1970-01-01
  • 2018-07-05
  • 2022-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-11
相关资源
最近更新 更多