文件名中的批处理命令日期和时间

Raj*_*ore 67 windows command-line cmd batch-file

我在命令行上使用WinZip压缩文件.由于我们每天都会存档,因此我尝试为这些文件添加日期和时间,以便每次都自动生成一个新文件.

我使用以下命令生成文件名.将其粘贴到命令行,您应该看到一个带有日期和时间组件的文件名.

echo Archive_%date:~-4,4%%date:~-10,2%%date:~-7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.zip
Run Code Online (Sandbox Code Playgroud)

产量

Archive_20111011_ 93609.zip
Run Code Online (Sandbox Code Playgroud)

但是,我的问题是AM vs PM.AM时间戳给我时间9(带有前导空格)与10自然占据两个空格.

我想我的问题将延续到头九天,前九个月等等.

我如何解决这个问题,以便包含前导零而不是前导空格,所以我得到了Archive_20111011_093609.zip

Ste*_*han 63

另一种方案:

for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set datetime=%%I
Run Code Online (Sandbox Code Playgroud)

它会给你(独立于区域设置!):

  20130802203023.304000+120
( YYYYMMDDhhmmss.<milliseconds><always 000>+/-<timedifference to UTC>  )
Run Code Online (Sandbox Code Playgroud)

从这里开始,很容易:

set datetime=%datetime:~0,8%-%datetime:~8,6%
20130802-203023
Run Code Online (Sandbox Code Playgroud)

对于Logan对文件的"日期时间修改"的相同输出格式的请求:

for %%F in (test.txt) do set file=%%~fF
for /f "tokens=2 delims==" %%I in ('wmic datafile where name^="%file:\=\\%" get lastmodified /format:list') do set datetime=%%I
echo %datetime%
Run Code Online (Sandbox Code Playgroud)

它有点复杂,因为它只适用于完整路径,wmic期望反斜杠加倍并且=必须转义(第一个.第二个受周围引号保护).

  • @AnonymousMohit:%% I用于批处理文件。如果直接在命令提示符下使用该行,则必须使用`%I`。 (3认同)

Ale*_* K. 55

提取小时,寻找前导空格,如果发现替换为零;

set hr=%time:~0,2%
if "%hr:~0,1%" equ " " set hr=0%hr:~1,1%
echo Archive_%date:~-4,4%%date:~-10,2%%date:~-7,2%_%hr%%time:~3,2%%time:~6,2%.zip
Run Code Online (Sandbox Code Playgroud)

  • 为什么你应该搜索,你可以简单地用零'set hr =%hr:= 0%`替换所有空格 (10认同)
  • @jeb,为什么评论而不回答? (3认同)
  • @ZinanXing:因为此解决方案取决于本地设置(不同国家的日期/时间字符串的格式不同)。这就是为什么我更喜欢`wmic`解决方案(请参阅我对这个问题的回答) (3认同)

小智 20

你应该搜索; 你可以简单地将所有空格替换为零set hr=%hr: =0%- jeb 2011年 10月11日14:16

所以我做了:

set hr=%time:~0,2%
set hr=%hr: =0%
Run Code Online (Sandbox Code Playgroud)

然后%hr%在你正在格式化的任何字符串里面使用,总是得到一个两位数的小时.

(Jeb在最受欢迎的答案下的评论对我来说是最好的,也是最简单的.我在此重新发布,以便为未来的用户提供更明显的答案.)

  • 遗憾的是,您无法链接转换。`%time:~0,2: =0%` 会很好。:^( (2认同)

PA.*_*PA. 15

正如Vicky已经指出的那样,%DATE%%TIME%使用完全(无限)可自定义的短日期和时间格式返回当前日期和时间.

一个用户可以将其系统配置为返回Fri040811 08.03PM,而另一个用户可以选择08/04/2011 20:30.

对于BAT程序员来说,这是一场彻底的噩梦.

如果在退出BAT文件之前还原以前的格式,则将格式更改为固定格式可能会解决问题.但它可能会受到令人讨厌的竞争条件的影响,并且取消了BAT文件中的恢复.

幸运的是,还有另一种选择.

您可以使用WMIC.WMIC Path Win32_LocalTime Get Day,Hour,Minute,Month,Second,Year /Format:table以不变的方式返回日期和时间.使用FOR /F命令直接解析它非常方便.

所以,把这些碎片放在一起,试试这个作为起点......

SETLOCAL enabledelayedexpansion
FOR /F "skip=1 tokens=1-6" %%A IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO (
  SET /A FD=%%F*1000000+%%D*100+%%A
  SET /A FT=10000+%%B*100+%%C
  SET FT=!FT:~-4!
  ECHO Archive_!FD!_!FT!.zip
 )
Run Code Online (Sandbox Code Playgroud)


Nes*_*sar 11

在阅读完所有答案后,我找到了最适合我的解决方案:

set t=%date%_%time%
set d=%t:~10,4%%t:~7,2%%t:~4,2%_%t:~15,2%%t:~18,2%%t:~21,2%
echo hello>"Archive_%d%"
Run Code Online (Sandbox Code Playgroud)

如果我得到20160915_ 150101(带领先的空间和时间).

如果PM我得到20160915_2150101.


小智 5

@For /F "tokens=1,2,3,4 delims=/ " %%A in ('Date /t') do @(

Set DayW=%%A

Set Day=%%B

Set Month=%%C


Set Year=%%D


Set All=%%D%%B%%C
)
"C:\Windows\CWBZIP.EXE" "c:\transfer\ziptest%All%.zip" "C:\transfer\MB5L.txt"
Run Code Online (Sandbox Code Playgroud)

如果在 2012 年 2 月 4 日运行,则需要 MB5L.txt 并将其压缩为 ziptest20120204.zip


归档时间:

查看次数:

254954 次

最近记录:

6 年,1 月 前