批处理无法识别现有变量?
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"
)
我正在做一个小实验,我有一个批处理文件将环境变量 %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"
)