批次无法识别现有变量?

时间:2018-12-27 17:13:51

标签: batch-file vbscript environment-variables batch-processing hybrid

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

: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已关闭”。这意味着即使变量DOES存在且其中包含某些内容,批处理文件在变量%dateextracted%中也看不到任何内容。例如,自发布此主题起,日期为12/27/2018。因此,变量应填写2018年12月27日。如果我打开Visual Basic脚本输出的文本文件,则显示为12/27/2018。因此,可视化基本脚本没有问题,它只是批处理文件。我不知道我是否错误地导入了文本文件的内容,或者仅仅是语法错误。

1 个答案:

答案 0 :(得分:1)

这似乎令人惊讶,但是您的批处理脚本无法识别变量%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"
)
相关问题