Пакет не распознает существующую переменную? - PullRequest
0 голосов
/ 27 декабря 2018

Я работаю над небольшим экспериментом, в котором у меня есть пакетный файл, выводящий содержимое переменных среды %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 выключен".Это означает, что командный файл ничего не видит в переменной %dateextracted%, даже если переменная существует, и в ней есть вещи.Например, на момент публикации этой темы, дата 27.12.2008.Итак, переменная должна быть заполнена 27.12.2008.Если я открою текстовый файл, который выводил скрипт Visual Basic, он говорит, что 27.12.2008.Так что с визуальным базовым скриптом проблем нет, это просто командный файл.Я не знаю, неправильно ли импортирую содержимое текстового файла, или это просто синтаксическая ошибка.

1 Ответ

0 голосов
/ 28 декабря 2018

Это может показаться удивительным, но ваш пакетный скрипт не распознает переменную %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"
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...