使用%time%变量,批处理脚本需要前导零


26

我在DOS脚本中遇到了一个错误,该错误使用日期和时间数据进行文件命名。问题是我最终以间隔结束,因为时间变量没有在小时<10时自动提供前导零。所以运行> echo%time%会返回:'9:29:17.88'。

有谁知道有条件地填充前导零以解决此问题的方法吗?

更多信息:我的文件名设置命令是:

set logfile=C:\Temp\robolog_%date:~-4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log

最终是:C:\ Temp \ robolog_20100602_ 93208.log(上午9:23)。

这个问题与有关。

谢谢


可以获取填充的小时值... FOR / F“ TOKENS = 1 DELIMS =:” %% A IN('TIME / T')设置HH = %% A,然后替换%time:〜0.2%与%HH%我希望有一个更紧凑的解决方案,但这会起作用。
Ira 2010年

“更紧凑”的解决方案将是另一种语言的东西(powershell?python?perl?WSH?)。
grawity 2010年

切换为我使用的解决方案标记为Jesse的答案。它既可以在午前时间与前导0填充,也可以在午后军事时间使用。
伊拉克

Answers:


60

一种非常简单的方法是将前导空格替换为零:
echo %TIME: =0%
输出:
09:18:53,45


1
有用!这是我认为最简单的解决方案..
aerobrain

可以同时使用多个字符吗?全部为“,”,“”和“:”。目前,我创建了中间变量,但是当然,这仅是由于替换次数很少而起作用。更多的事情将是麻烦的。
Devolus'1

1
我在第二个“步骤”中使用它来修改小时数:set HH=%time:~-11,2% set MM=%time:~-8,2% set SS=%time:~-5,2% set ISOTIME=%HH: =0%-%MM%-%SS% echo %ISOTIME%另请参见ss64.com/nt/syntax-replace.html
处理

+1这是最短/最好的答案。我的使用方式:set timestring=%TIME: =0%在子调用的早期-然后直接使用timestring(或您使用的任何变量)。
bshea

14

我的解决方案是使用以下想法:

SET HOUR=%TIME:~0,2%
IF "%HOUR:~0,1%" == " " SET HOUR=0%HOUR:~1,1%

我喜欢。简单直观。
肯(Ken)

适用于现代Windows,但在Server 2003上却给出语法错误!
BDO Adams博士

最完美的解决方案可在2008+上完美运行。谢谢。
bjoster

1
but gives syntax error on server 2003-为什么在2016年会如此?
Marcin Orlowski

Windows 10命令提示符上的完美选择
Mike Upjohn '18

5

丹尼斯的回答类似的想法。问题在于的宽度%time%始终相同,因此它将在开头插入一个空格,而不是返回较短的字符串。

您可以使用以下方法消除它for

for /f "delims= " %x in ("%time%") do set T=0%x

其余的差不多。


2
此解决方案适用于> 10,但现在为10创建了“ 010”:...
Devolus

3
杰西的答案是正确的……
西蒙·索比斯

这是一个非常糟糕的答案,一小时内出现两位数就会崩溃。我无法相信OP选择了它。
thebunnyrules

3

使用Jesse的贡献,我刚刚使用修改后的输出创建了一个变量。然后,我引用该变量来构建小时部分。

set NantTime=%time: =0%
nant\bin\nant.exe -nologo+ -debug+ -verbose+ -D:project.config=debug /f:build\default.build -l:logs\architect-build-%DATE:~10,4%-%DATE:~4,2%-%DATE:~7,2%-%NantTime:~0,2%-%time:~3,2%-%time:~6,2%.log 
pause

原始来源:

set hour=%time: =0%
set logfile=C:\Temp\robolog_%date:~-4%%date:~4,2%%date:~7,2%_%hour:~0,2%%time:~3,2%%time:~6,2%.log

谢谢杰西。如果我有声望点,我会投票的。


1

对于实现以上所有内容的最紧凑的解决方案,我认为

FOR / F“令牌= 1-4 DELIMS = /” %% A IN(“%DATE%”)做FOR / F“令牌= 1-3 DELIMS =:”。%% E IN(“%TIME:= 0%”)DO SET logfile = C:\ Temp \ robolog _ %% D %% C %% B _ %% E %% F %% G.log

将在这里工作而无需向脚本添加任何新行。不过,它可能不如多个命令解决方案那么优雅。


1

以下内容多了几行,但清晰易懂。它将stdout和stderr保存到单独的文件中,每个文件都带有时间戳。时间戳按该顺序包括年,月,日,小时,分钟和秒。时间戳记应始终将最重要的日期部分放在第一位(年份),而最后一部分则使用最少的时间(秒)。这样可以使文件列表按时间顺序排列。事不宜迟,这是我的解决方案。

:prepare time stamp 
set year=%date:~10,4%
set month=%date:~4,2%
set day=%date:~7,2%
set hour=%time:~0,2%
:replace leading space with 0 for hours < 10
if "%hour:~0,1%" == " "  set hour=0%hour:~1,1%
set minute=%time:~3,2%
set second=%time:~6,2%
set timeStamp=%year%.%month%.%day%_%hour%.%minute%.%second%

:run the program 
ProgramName.pl 1> RunLogs\out.%timeStamp% ^
               2> RunLogs\err.%timeStamp%

0

这会将零添加到时间的开始,并占用小时的最后两位数字(分钟和第二开始位置偏移一个)。因此,凌晨3点变成“ 03”,然后变成“ 03”,小时15变成“ 015”,然后变成“ 15”。

set T=0%time%
set T=%T:~1,2%%T:~4,2%%T:~7,2%
set D=%date:~-4%%date:~4,2%%date:~7,2%
set logfile=C:\Temp\robolog_%D%_%T%.log

不太可读:

set T=0%time%
set logfile=C:\Temp\robolog_%date:~-4%%date:~4,2%%date:~7,2%_%T:~1,2%%T:~4,2%%T:~7,2%.log

1
我不确定这行得通。如果我运行'set T = 0%time%'并且是9:38 AM,则回显%T%会返回:'0 9:38:54.21',然后使用%T:〜1,2%会获得空格,没有前导0.
Ira Ira

0

一行代码即可满足您的需求:

    IF "%Time:~0,1%" == " " SET TimeStamp=0%Time:~1,7%

例如,我使用%Date%,然后将前导零添加到用于确定是否需要将%Time%的前导空格替换为零的变量。

    ::Prepare TimeStamp variable by replacing leading space with 0 for Hours < 10
    SET TimeStamp=%Time:~0,8%
    IF "%Time:~0,1%" == " " SET TimeStamp=0%Time:~1,7%
    Echo Started on %Date$ at %TimeStamp%

    :: Insert what you are doing here...

    SET TimeStamp=%Time:~0,8%
    IF "%Time:~0,1%" == " " SET TimeStamp=0%Time:~1,7%
    ECHO Finished on %Date% at %TimeStamp%

0

这将创建一个可排序的时间戳记,第二行确保没有空格可容纳单位小时数等,以使其可用于脚本:

set datestamp=%date:~-4%.%date:~-10,-8%.%date:~-7,-5%_%time:~0,2%.%time:~3,2%.%time:~6,2%
set datestamp=%datestamp: =_%

输出:

2018.02.26__9.47.34


0

感谢您的帮助...这就是我正在使用的:

C:\Windows\System32>SET short=%date:~10,4%-%date:~4,2%-%date:~7,2%
C:\Windows\System32>ECHO -- Short Date: %short%
-- Short Date: 2018-06-27
C:\Windows\System32>SET long=%date:~10,4%-%date:~4,2%-%date:~7,2%_%time:~0,2%_%time:~3,2%_%time:~6,2%
C:\Windows\System32>ECHO -- Long Date: %long%
-- Long Date: 2018-06-27_10_51_43

然后,我有在Robocopy作业中被调出的日志,如下所示:

有很多这样的:

Robocopy C:\Users\ME\Favorites\ %usb%:\Local_PC\Favorites\ /MIR /TEE /FFT /DST /TIMFIX /W:5 /R:5 /NP /LOG+:%usb%:\Robocopy\LOG_%short%.txt

以此结束工作:

REN %usb%:\Robocopy\LOG_%short%.txt COMPLETE_LOG_%long%.log

COMPLETE_LOG_2018-06-27_10_53_54.log 是末尾生成的文件,可以按文件名排序。


0

Jesse的答案通过消除小时字段中的空格解决了我的文件重命名问题。这是我设置变量的方式:

for /f "tokens=1,2,3,4 delims=/ " %%a in ("%date%") do set wday=%%a&set month=%%b&set day=%%c&set year=%%d
for /f "tokens=1,2 delims=:" %%a in ("%time: =0%") do set hour=%%a&set minute=%%b

它像冠军一样运作;由于某种原因,日期不需要相同的处理,但是我认为这取决于区域设置。


0
    @echo off



    call :PAD aaa,2,0,grw
    echo [[aaa=%aaa%]]
    pause




rem #### Function PAD ####
    goto :PADEND
    :PAD <var>,<length>,<padchar>,<string>
        set padtot=%~2
        set padchar=%~3
        set padString=%~4
        :StartPADLOOP
            call :len lenpadString,%padString%
            if ["%lenpadString%"] GEQ ["%padtot%"] goto :EndPADLOOP
            set padString=%padchar%%padString%
            goto :StartPADLOOP
        :EndPADLOOP
        set %~1=%padString%
    GOTO :EOF
    :PADEND


rem #### Function LEN ####
    goto :LENEND
    :LEN <var>,<string>
        set LENtempvar=%~2
        rem echo {{S:%LENtempvar%}}
        set LENCOUNT=0    
        :startLENLOOP
            if ["%LENtempvar%"] EQU [""] goto :endLENLOOP
            rem echo {{A:%LENtempvar%}}
            set LENtempvar=%LENtempvar:~0,-1%
            rem echo {{B:%LENtempvar%}}
            set /a LENCOUNT=LENCOUNT+1
        goto :startLENLOOP
        :endLENLOOP
        set %~1=%LENCOUNT%
    GOTO :EOF
    :LENEND

-2
set sFolderName=%time: =0%
xcopy "%UserProfile%\Pictures\*.jpg" Y:\"%DATE%-%sFolderName:~0,2%h%time:~3,2%m%time:~6,2%s-%random%" /I /C /Y

15.06.2015-03h43m34s-5357

5357-%random%"

5
尽管可以理解该代码,但应始终附有解释。这不必很长,但是可以预期。
彼得说恢复莫妮卡2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.