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

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

我使用以下来生成一个文件名。 复制粘贴到您的命令行,你应该看到一个文件名与日期和时间组件。

echo Archive_%date:~-4,4%%date:~-10,2%%date:~-7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.zip 

产量

 Archive_20111011_ 93609.zip 

不过,我的问题是AMPM 。 上午时间戳给我的时间9 (带领先的空白)与10自然占据了两个空间。

我想我的问题将延伸到头9天,头9个月等。

我如何解决这个问题,以便领先零,而不是领先的空格,所以我得到了Archive_20111011_093609.zip

另一个方案

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

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

  20130802203023.304000+120 ( YYYYMMDDhhmmss.<milliseconds><always 000>+/-<timedifference to UTC> ) 

从这里,很容易:

 set datetime=%datetime:~0,8%-%datetime:~8,6% 20130802-203023 

对于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% 

它有点复杂,因为它只适用于全路径, wmic期望反斜杠加倍,而=必须被转义(第一个,第二个被周围的引号保护)。

提取小时,寻找领先的空间,如果发现替换为零;

 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 

你应该搜索; 你可以简单地替换所有的空格与零set hr=%hr: =0% 评论时间7001 月01日 原作者 set hr=%hr: =0% jeb

所以我做了:

 set hr=%time:~0,2% set hr=%hr: =0% 

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

(杰布在最受欢迎的答案中的评论对我来说是最好的,也是最简单的。我在这里重新发布它,使其对未来用户更为明显)。

正如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 ) 

您可以在批处理中将前导零添加到变量(值最高为99): IF 1%Var% LSS 100 SET Var=0%Var%

所以你需要把你的日期和时间分量解析成单独的变量,把它们全部这样对待,然后把它们连接在一起来创建文件名。

但是,解析日期和时间的基础方法取决于系统区域设置。 如果你很高兴你的代码不能移植到其他机器上,那可能是好的,但是如果你希望它能在不同的国际环境下工作,那么你需要一个不同的方法,例如通过读取注册表设置:

 HKEY_CURRENT_USER\Control Panel\International\iDate HKEY_CURRENT_USER\Control Panel\International\iTime HKEY_CURRENT_USER\Control Panel\International\iTLZero 

(最后一个控制是否有一个前导零时间,但不是我所知的日期)。

 @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" 

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

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

 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%" 

如果AM获得20160915_ 150101 (具有领先的空间和时间)。

如果PM我得到20160915_2150101

你的问题似乎已经解决了,但…

我不确定你是否为自己的问题采取了正确的解决方案。
我想你试着压缩每一天的实际项目代码。

这是可能的与ZIP和1980这是一个很好的解决方案,但今天你应该使用一个存储库系统,如subversion或git或…,但不是一个zip文件。

好吧,也许这可能是我错了。

从上面的答案,我已经做了一个准备使用的功能。

通过法国本地设置进行验证。

 :::::::: PROGRAM :::::::::: call:genname "my file 1.txt" echo "%newname%" call:genname "my file 2.doc" echo "%newname%" echo.&pause&goto:eof :::::::: FUNCTIONS ::::::::: :genname set d1=%date:~-4,4% set d2=%date:~-10,2% set d3=%date:~-7,2% set t1=%time:~0,2% ::if "%t1:~0,1%" equ " " set t1=0%t1:~1,1% set t1=%t1: =0% set t2=%time:~3,2% set t3=%time:~6,2% set filename=%~1 set newname=%d1%%d2%%d3%_%t1%%t2%%t3%-%filename% goto:eof 

我意识到这对于OP来说是一个有争议的问题,但是我只是酝酿了这一点,而且我为自己跳槽而感到自豪。

下载gawk for Windows http://gnuwin32.sourceforge.net/packages/gawk.htm ….然后它是一个班轮,没有那么笨重的DOS批处理语法,它需要六个FOR循环来拆分字符串(WTF ?真的是真的很坏,伤心!恕我直言,当然)

如果你已经知道C,C ++,Perl或者Ruby,那么拾取AWK (从前两个继承而来,并且对后者有很大贡献)是一个普通的CAKE!

DOS批处理命令:

 echo %DATE% %TIME% && echo %DATE% %TIME% | gawk -F"[ /:.]" "{printf(""""%s%02d%02d-%02d%02d%02d\n"""", $4, $3, $2, $5, $6, $7);}" 

打印:

 Tue 04/09/2012 10:40:38.25 20120904-104038 

现在,这不是完整的故事…我只是懒惰和硬编码我的日志文件名称在printf语句中的其余部分,因为它很简单…但如果有人知道如何设置%NOW%变量AWK的输出(yeilding的“通用”现在功能的胆量),那么我都耳朵。


编辑:

在堆栈溢出的快速搜索填补了最后一块难题, 批量相当于Bash反引号

所以,这三行DOS批处理:

 echo %DATE% %TIME% | awk -F"[ /:.]" "{printf(""""%s%02d%02d-%02d%02d%02d\n"""", $4, $3, $2, $5, $6, $7);}" >%temp%\now.txt set /p now=<%temp%\now.txt echo %now% 

生产:

 20120904-114434 

因此,现在我可以在由SQL Server安装(2005+)脚本生成的日志文件的名称中包含日期时间:

 sqlcmd -S .\SQLEXPRESS -d MyDb -e -i MyTSqlCommands.sql >MyTSqlCommands.sql.%now%.log 

而且我又是一个快乐的露营者(除了Unix上的生活依然SOOOOO更容易)。

文件名中的空格是合法的。 如果你把你的路径和文件名引号,它可能会飞。 以下是我在批处理文件中使用的内容:

 svnadmin hotcopy "C:\SourcePath\Folder" "f:\DestPath\Folder%filename%" 

%filename%中是否有空格并不重要。