Windows命令行:创建名称为当前日期的文件


19

我正在尝试从批处理脚本创建一个zip文件。我需要将其命名为archive_.zip

不幸的是,由于斜杠,这在日期格式为y / m / d的系统上不起作用:

zip some_options "archive_%DATE%.zip"

%DATE%变量扩展到像

Mon 09/28/2009

我可以访问gnuwin32软件包,因此可以用sed破折号代替空格和斜杠。问题是,我将如何使用的输出sed来创建zip归档文件的文件名?

在Unix(bash)中,可以使用反引号来就地评估命令,并在另一条命令中使用其输出,例如:

zip [...] archive_`echo %DATE% | sed -e s/.../.../`.zip

Windows中有类似的功能吗?

也许有一种方法可以将变量设置为返回值,sed然后使用该变量来构造文件名?

Answers:


27

您可以使用来替换变量中的符号:

set _date=%DATE:/=-%

1
这是一个整洁的把戏!
Cristi Diaconescu

PS是否也有一种“单线”方式来消除空格或其他令人讨厌的字符?(而不是为每个角色替换一个3rd ... nth临时变量)
Cristi Diaconescu

不好意思 似乎没有这样的事情。您必须回退到for语法才能做到这一点。注意:这是批处理编程的不错参考:robvanderwoude.com/batchfiles.php
Christopher 2009年

5
这是速度甚至比:%date:~-10,2%-%date:~-7,2%-%date:~-4,4%
杰西·斯通

没有人+1您的回应杰西·斯通!向我+1 !!!
Arvo Bowen 2014年

5

我一直使用:

For /f "tokens=1,2,3,4,5 delims=/. " %%a in ('date/T') do set CDate=%%a%%b%%c%%d

然后CDate将是Sat02182012。如果要使其更可排序,请将CDate设置为%% d-%% b-%% c,这样就可以了2012-02-18

For /f "tokens=1,2 delims=:" %%f in ('time /t') do set CTime=%%f%%g

使日期和时间文件夹/文件友好。


4

我已经发布了一个答案,一个非常类似的问题在这里。日期在字段中的分割是1行,而不是harrymc的答案中的几行。

有趣的部分是:

@echo off
for /F "tokens=2-4 delims=/ " %%i in ('date /t') do set yyyymmdd=%%k%%j%%i
echo Date: %yyyymmdd%

该警告仍然相关:

警告:日期的格式(yyyymmdd = %% k %% j %% i)取决于您的区域设置。因为我使用的是法语日期格式(dd / mm / yyyy),所以必须使用“ %% k %% j %% i”作为格式(%% i =天,%% j =月,%% j =年)。

如果您将区域设置设置为美式(mm / dd / yyyy),则应使用“ %% k %% i %% j”(%% i =月,%% j =天,%% j =年) 。


3
zip some_options "archive_%date:/=-%.zip"

/=-替代的/用减号。


2

这段相当糟糕的代码应该执行您想要的操作

move "Filename.txt" "Filename%date:~6,4%%date:~3,2%%date:~0,2%_%Time:~0,2%%Time:~3,2%%Time:~6,2%.txt"

如果适当更改文件名。


1
介意解释怪兽吗?:)
Cristi Diaconescu

它基本上是从日期中砍掉部分并将其馈送到文件名的中间,您可以通过执行echo然后在命令行中部分恐怖内容进行测试,因此如果您执行%date:〜6,4%,它将给出年。只是将日期和时间放入字符串。
上校

有趣。不幸的是,它不太便于携带……
Cristi Diaconescu

不幸的是,使用子字符串的问题在于它依赖于特定的日期格式,并且在不同的日期格式时会崩溃。由于我已将日期设置为使用yyyy-MM-dd(所以今天是2009-09-28),因此会在我的计算机上echo %date:~6,4%%date:~3,2%%date:~0,2%返回9-289-20
约书亚

没错,我只在一台机器上使用此解决方案,所以这不是太大的问题。
上校

2

由于您的问题被标记为Windows,因此我发现此解决方案可在旧的.bat文件中使用:
“ Windows批处理文件(.bat)以MMDDYYYY格式获取当前日期”
并且可能适合您的情况:


@REM Seamonkey的快速日期批处理中回显(MMDDYYYY格式)
@REM设置%date变量
@REM首先将月,日和年解析为mm,dd和yyyy格式,然后合并为MMDDYYYY

对于/ F“ TOKENS = 1 * DELIMS =” %% A IN('DATE / T'),请设置CDATE = %% B
FOR / F“ TOKENS = 1,2 eol = / DELIMS = /” %% A IN( 'DATE / T')
为/ F 设置mm = %% B “令牌= 1,2 DELIMS = / eol = /” %% A IN('echo%CDATE%')为dd = %% B
FOR SET F“令牌= 2,3 DELIMS = /” %% A IN('echo%CDATE%')进行设置yyyy = %% Bv vSET日期=%mm %% dd %% yyyy%

这除了将%date变量设置为MMDDYYYY格式的今天的日期外,什么也没有做,因此可以稍后在脚本中调用它。

编辑
发现更好的语法。给定我的日期是今天“ 2009年8月28日星期一”:
设置日期=%日期:〜0.2%
设置月份=%日期:〜7.2%
设置年份=%日期:〜10.4%


2

结合gnuwin32-'date'的纯cmd.exe版本:

%> for /F "usebackq" %d in ( `date.exe +"%y%m%d"` ) do zip archive_%d.zip <folder>

这样就可以进行就地替换!如果您问我,“ for”命令有一种怪异的语法……
Cristi Diaconescu

我没有声称它不能:)无论如何,整个“ cmd”的东西都是疯狂的,无论谁设计的,都陷入了某种坏梦。“ for” cmd实际上会在第一遍中创建行(也称为“展开”“循环”),然后执行如此“创建”的脚本。
akira

1

怎样使用cscript + vbasic:

WScript.shell.run "zip archive_" & DatePart("yyyy", Now) & "_" & DatePart("m", Now) & "_" & DatePart("d", Now) & ".zip " & WScript.arguments(0)

通过调用

cscript /nologo zip_it.vbs

1

对于/ f“令牌= 1,2,3,4,5 delims = /。”('date / T')中的%% a确实设置CDate = %% d-%% b-%% c

@echo数据=%CDate%

这是现在最常见的年月日


1

如果用户修改了他/她的区域设置,则使用%DATE%或输出的任何解决方案date /t都可能会中断。例如,我将“短日期”格式设置为"yyyy-MM-dd",因此%DATE%等于"2012-02-18",并date /t产生相同的输出。(这适用于Windows 7;我认为与Windows的早期版本相同。)

生成一个批处理文件,然后执行它。

由于您可以使用GNU date命令,因此可以执行以下操作:

C:\path\to\gnu\date "+zip some_options archive_%Y-%m-%d.zip" > tmp.bat
call .\tmp.bat

tmp.bat 将包含如下内容:

zip some_options archive_2012-02-18.zip

请注意,这会tmp.bat在当前目录中创建,这可能是一个问题。创建它可能更好%TEMP%\tmp.bat。后来我也没有删除文件。这很容易做到。

date +FORMAT使您可以指定date命令的输出格式,类似于printf格式字符串;有关详细信息,请参见coreutils日期文档。该格式可以包含任意文本,因此在这种情况下,您甚至不需要使用sed


1

我想,如果您将每个人的意见都汇集在一起​​,那么您会得到适合您的东西。这是在Windows 2003系统上,用于响应性能监视器的触发,为我提供正在运行的进程的快照:

@echo off
For /f "tokens=1,2,3,4,5 delims=/. " %%i in ('date /t') do set CDate=%%k%%j%%i
For /f "tokens=1,2 delims=:" %%f in ('time /t') do set CTime=%%f%%g
tasklist /fo table >tasklist%CDate%%CTime%.txt

输出文件以一个没有分隔符的字符串命名。


0
zip [...] archive_`echo %DATE% | tr / -`.zip

应该管用。

另一方面-也许您有date可用的命令(我不知道Windows)。如果是,则执行以下操作:

zip [...] archive_`date +'%Y-%m-%d'`.zip

反引号技巧在cmd.exe中不起作用。Windows“ date”命令无法处理格式:(
Cristi Diaconescu

-1

不确定是否适合您,但是我的代码是

@ECHO OFF
set ldt=%date% %time%
echo %ldt%>> logs.txt

OP希望使用文件而不是文件内容中
Jan Doggen 2014年
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.