批处理无法识别现有变量?

Batch won't recognize an existing variable?

我正在做一个小实验,我有一个批处理文件将环境变量 %DATE%%TIME% 的内容输出到一个文本文件中。然后,Visual Basic 脚本将读取文件,并根据模式挑选出文件文本的特定部分,并将其输出到单独的文本文件中。然后批处理文件将读取该文件并将其作为变量导入。这是代码:

:load
@echo off
if exist date.txt DEL date.txt
if exist time.txt DEL time.txt
if exist dateextracted.txt DEL dateextracted.txt
title Testing
color 0a
goto start

:start
echo %DATE%> date.txt
echo %time%> time.txt
echo. > dateextracted.txt
START date.vbs
goto wait1

:wait1
if exist dateextracted.txt goto wait2
goto wait1

:wait2
for /f "Delims=" %%a in (dateextracted.txt) do (
set dateextracted=%%a
)
echo %dateextracted%
pause
exit

现在的问题是批处理文件只是说 "ECHO is off." 这意味着批处理文件在变量 %dateextracted% 中看不到任何内容,即使变量确实存在,并且有里面的东西。例如,发布此线程时,日期是 12/27/2018。因此,变量应填充为 12/27/2018。如果我打开 Visual Basic 脚本输出的文本文件,它会显示 12/27/2018。所以visual basic脚本没有问题,只是批处理文件而已。不知道是我导入的文本文件内容有误,还是只是语法错误

这似乎令人惊讶,但您的批处理脚本无法识别变量 %dateextracted%,因为它实际上并不存在。

echo. > dateextracted.txt 已经创建了文件 dateextracted.txt,因此您的 :wait1..goto wait1 循环会立即跳到 :wait2。但是,由于 START date.vbs 是 运行 VBScript 在后台异步运行,当您的 for 循环正在读取 dateextracted.txt 时,脚本很可能尚未完成。在那种情况下,循环正在读取一个空文件,因此没有定义变量 %dateextracted%。这又会导致后续 echo 命令显示回显状态,因为由于未定义的变量,命令在没有参数的情况下被调用。

您可以通过 运行 date.vbs 同步解决问题,方法是使用 cscript.exe 解释器而不是默认的 wscript.exe。改变这个:

echo. > dateextracted.txt
START date.vbs
goto wait1

:wait1
if exist dateextracted.txt goto wait2
goto wait1

:wait2
for /f "Delims=" %%a in (dateextracted.txt) do (
set dateextracted=%%a
)

进入这个:

echo. > dateextracted.txt
cscript.exe //NoLogo date.vbs

for /f "Delims=" %%a in (dateextracted.txt) do (
    set "dateextracted=%%a"
)