在批处理文件中定义变量不起作用



我有一个批处理文件,如以下内容:

For /f "tokens=2-4 delims=/ " %a in ('date /t') do (set newdate=%c%a%b)
blat my_file_%newdate% -to test@email.com -f test_email.com

当我在CMD窗口中分别输入两个命令时,它似乎可以很好地工作,但是当放入批处理文件并手动运行时,它不起作用。

打开命令提示符窗口并运行for /?。输出是此命令的帮助,其中包含在最高信息的顶部:

要在批处理程序中使用for命令,请指定%%变量
%变量。可变名称对大小写敏感,因此%i不同于%i。

接下来,我建议运行set /?并至少阅读输出的最后一页帮助列出环境变量DATE

如果启用了命令扩展名,则有几个动态
可以扩展但不会显示的环境变量
在设置显示的变量列表中。这些变量值是
每次扩展变量的值时,都会动态计算。
如果用户明确定义了其中一个名称之一,则
该定义将覆盖下面描述的动态一个:

%CD% - 扩展到当前目录字符串。

%日期% - 使用与日期命令相同的格式扩展到当前日期。

%time% - 使用与时命令相同的格式扩展到当前时间。

%随机% - 扩展到0和32767之间的随机小数。

%errorLevel% - 扩展到当前错误级别值

%cmdextversion% - 扩展到当前命令处理器扩展
版本编号。

%cmdcmdline% - 扩展到调用
的原始命令行 命令处理器。

%最高numanodeNumber% - 扩展到最高的numa节点编号
在这台机器上。

因此,也许无需在 cmd.exe /C的背景中在单独的命令过程中运行命令行date /T> for 在上完成的命令行,捕获此命令过程的输出和过程进行行划线。

好吧,date /T或使用%DATE%的日期输出格式取决于Windows区域的设置。而且没有发布带有二手帐户的用过的机器上的日期格式。但是我想以下工作也更快一点。

for /F "tokens=2-4 delims=/ " %%a in ("%DATE%") do set "newdate=%%c%%a%%b"

我想仅使用字符串替换在您的计算机上也可以使用日期格式MM/dd/yyyydddd, MM/dd/yyyy

set "newdate=%DATE:~-4%%DATE:~-10,2%%DATE:~-7,2%"

最后一个解决方案比其他解决方案快。

也有一个独立的区域解决方案,例如在答案中详细解释了%date%在按计划任务执行的批处理文件中产生不同的结果?但是,与动态环境变量DATE相比,使用 WMIC 使用区域独立解决方案要慢得多。

批处理变量需要具有%%而不是一个

看来您正在寻找yymmdd的输出,如果是这样,请尝试以下操作:

For /f "tokens=1-4 delims=/ " %%a in ('date /t') do (set newdate=%%c%%a%%b)

最新更新