sql-server - 如何将 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 格式的日期
我究竟做错了什么?
解决方案
动态环境变量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 /?
推荐阅读
- angular - 当输入中的文本更改时,在 angualr 中设置自定义验证
- tensorflow - 在 tensorflow 2.0 中编写我们自己的自定义训练循环时如何执行提前停止?
- reactjs - 从父级提交后重新启动 Formik 表单
- r - 正则表达式在 R 中捕获包含标点符号的子字符串
- windows - 在 Set-PSBreakpoint 的操作块中记录当前正在执行的命令
- c++ - 二叉树数据结构的扁平数组表示
- python - oracle in out pl sql package in python过程调用错误
- f# - FSharp.Data XML 类型提供程序是否生成?
- python - 创建一个回溯程序,返回所有 P 位数字,使得每 3 个连续数字总和为 S
- outlook-web-addins - 我可以跟踪用户未安装 Outlook 加载项的原因吗?