我正在做一个小实验,我有一个批处理文件,将环境变量%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。因此,可视化基本脚本没有问题,它只是批处理文件。我不知道我是否错误地导入了文本文件的内容,或者仅仅是语法错误。
答案 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"
)