从Windows Scheduler运行批处理文件时缺少时间戳

时间:2016-06-10 07:48:57

标签: batch-file timestamp

我有一个非常简单的批处理文件

@SET isodt=%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%_%TIME::=-%
DatabaseCleansing.Process.exe > output\output_%isodt%.txt

手动运行时会创建类似

的文件名
  

output_2016-06-09_23-29-47.44.txt

但是,当Windows Scheduler自动运行时,它会创建如下文件名:

  

output_2016-06-10 _

两种情况下文件的内容都是正确的。 我猜错了什么?

1 个答案:

答案 0 :(得分:1)

@ECHO OFF
SETLOCAL EnableExtensions
rem get CIM_DATETIME
for /f "tokens=2 delims==" %%G in (
  'wmic OS get localdatetime /value') do set "ldt=%%G"

rem simplified format yyyymmddHHMMSS.mm e.g. 20160610160046.36
set "isodt=%ldt:~0,17%"
echo simplified format yyyymmddHHMMSS.mm %isodt%

rem modified ISO format yyyy-mm-dd_HH-MM-SS.mm e.g. 2016-06-10_16-00-46.36
set "isodt=%ldt:~0,4%-%ldt:~4,2%-%ldt:~6,2%_%ldt:~8,2%-%ldt:~10,2%-%ldt:~12,5%"
echo modified ISO format yyyy-mm-dd_HH-MM-SS.mm %isodt%

rem use quotes around the output file (thanks for the thought, Stephan)
DatabaseCleansing.Process.exe > "output\output_%isodt%.txt"

解释:如果在10:00:0023:59:59之间运行,您的脚本将按预期工作。但是,%time%变量在00:00:0009:59:59之间包含前导空格
尽管有下一次格式设置,但仍会出现这种情况

==> reg query "HKCU\Control Panel\International" | findstr /I "sTimeFormat sShortTime"
    sTimeFormat    REG_SZ    HH:mm:ss
    sShortTime     REG_SZ    HH:mm

虽然HH应该显示带有前导零的小时;比较Change the display of dates, times, currency, and measurements文章所说的内容:

  

选择要使用的日期和时间格式。 Windows使用   以下符号用于指定日期和时间的显示方式:

Time notations  Displays
--------------  --------
h               Hour (hh displays the hour with a leading zero)
m               Minute (mm displays the minute with a leading zero)
s               Second (ss displays the second with a leading zero)
h/H             12 or 24 hour time display

使用

@SET "isodt=%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%_%TIME::=-%"
@SET "isodt=%isodt: =0%"

或更好,从区域设置 CIM_DATETIME yyyymmddHHMMSS.mmmmmmsUUU format获取%isodt%变量。例如,您可以修改next code snippet以添加连字符和下划线:

rem obtain %datetime% variable in locale independent yyyymmddHHMMSS format
for /f "tokens=2 delims==" %%G in (
  'wmic OS get localdatetime /value') do set "datetime=%%G"
set "isodt=%datetime:~0,17%"

此外,SET "isodt=%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%_%TIME::=-%"命令可以失败以及在下一个短日期格式设置下返回. 20- 0-10_15-22-11,63,该设置默认为我的Windows 8.1原始系统区域设置默认预安装为空格据称, 应该在完全停止后通过错误解释Czech language grammar rules

==> reg query "HKCU\Control Panel\International" /V sShortDate

HKEY_CURRENT_USER\Control Panel\International
    sShortDate    REG_SZ    dd. MM. yyyy