Command line Windows批处理文件-从当前日期计算文件名

Command line Windows批处理文件-从当前日期计算文件名,command-line,batch-file,Command Line,Batch File,我想创建一个环境变量来保存文件名,例如: PREFIX-2010-AUG-09.zip 如果我使用这样的东西,我可以接近: SET filename=PREFIX-%date:~-4,4%-%date:~-7,2%-%date:~0,2%.zip 结果: PREFIX-2010-08-09.zip 但在这种情况下,我得到的月份是两位数(08) 在Windows批处理文件中,是否有任何简单的技巧可以从数字月份中获取三个字母的月份缩写(例如,08表示“AUG”=August) 更新:这需要在W

我想创建一个环境变量来保存文件名,例如:

PREFIX-2010-AUG-09.zip
如果我使用这样的东西,我可以接近:

SET filename=PREFIX-%date:~-4,4%-%date:~-7,2%-%date:~0,2%.zip
结果:

PREFIX-2010-08-09.zip
但在这种情况下,我得到的月份是两位数(08)

在Windows批处理文件中,是否有任何简单的技巧可以从数字月份中获取三个字母的月份缩写(例如,08表示“AUG”=August)


更新:这需要在Windows 2008 R2服务器上运行,是的,如果有人能向我展示一个PowerShell解决方案,那也可以:-)谢谢

您始终可以手动进行数字到文本的翻译,如:

if %MM%==01 set MM=Jan
if %MM%==02 set MM=Feb
if %MM%==03 set MM=Mar
if %MM%==04 set MM=Apr
etc.

这类似于查找表:

set month_01=JAN
set month_02=FEB
set month_03=MAR
@rem ...

set number=02

for %%a in (month_%number%) do call set month_as_text=%%%%a%%

echo %month_as_text%
for
循环中
%number%
中的值用于取消对匹配变量名称的引用

甚至更短:

set number=02

for /f "tokens=%number%" %%m in ("JAN FEB MAR APR ...") do set month_as_text=%m

echo %month_as_text%

编辑:

Johannes建议对第1版使用简写法:

set month_01=JAN
set month_02=FEB
set month_03=MAR
@rem ...

set number=02

setlocal enabledelayedexpansion

set month_as_text=!month_%number%!    

echo %month_as_text%

第一个答案在八月和九月是不正确的。原因是shell将前导零解释为八进制,08和09不是有效的八进制数。通过运行以下命令,您可以轻松看到这一点:

for /f "tokens=08" %a in ("A B C D E F G H I J") do echo %a
如果用
09
替换上面的
08
,它也会失败。如果您使用
07
10
,它将起作用。工作执行情况如下:

months=JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC
:: get the month as a 2-digit number
set number=%date:~4,2%
:: remove leading zero
for /f "tokens=* delims=0" %%a in ("%number%") do set number=%%a
:: index into array to get month name
for /f "tokens=%number%" %%m in ("%months%") do set month_as_text=%%m
:: print month name
echo %month_as_text%

哪个版本的Windows?不同版本的数据处理往往不同。此外,您可以使用PowerShell吗?我打赌这会使这更容易。@Pekka:Server是Win Server 2008 R2,是的-Powershell也可以工作:-)我需要a)从FTP下载一个文件,b)解压缩它(这是我需要文件名的地方),c)将它还原到SQL Server for Powershell此链接可能有助于@Pekka:Date processing in batch不存在。自NT4以来,语言没有太大变化。您可以使用延迟扩展来缩短对
的数组访问!月份%number%@Johannes:我对此不确定,也找不到快速参考。但是您仍然需要定义数组,这就是为什么我更喜欢第二个(较短的)解决方案。无论如何,我会添加您的建议,谢谢。是的,第二个选项确实不错:-)-遗憾的是,这只适用于如此有限的一组项目,因为afaik标记器最多只允许31个标记。谢谢您的回答!帮助我离目标又近了一大步!