Запись вывода ECHO в файл VBS не работает
Я пишу Batch Script, который создает VB Script, повторяя каждую строку и направляя вывод в созданный файл. Он работает по большей части, за исключением двух строк, которые получают переменные командной строки и используют ее как переменные VBS. Это код:
ECHO:strHomeFolder = oShell.ExpandEnvironmentStrings^(^"^%USERPROFILE^%^"^) >> uninstallBeta.vbs
ECHO:strProgramData = oShell.ExpandEnvironmentStrings^(^"^%ProgramData^%^"^) >> uninstallBeta.vbs
Это должно выглядеть так в скрипте VB:
strHomeFolder = oShell.ExpandEnvironmentStrings("%USERPROFILE%")
strProgramData = oShell.ExpandEnvironmentStrings("%ProgramData%")
Но то, что происходит, это Batch Script, он просто повторяет всю строку, включая >> uninstallBeta.vbs
, Есть идеи, почему это происходит? У меня есть похожие строки для создания других VBS и Batch-скриптов, которые, я думаю, отлично работают, делая это таким образом. Я проверил на опечатки и не нашел ни одного. Он прекрасно работает в командной строке, но не в пакетном скрипте.
2 ответа
Это помогает понять, как cmd.exe анализирует пакетные сценарии:
Часть 1 - Обзор
Часть 2 - Детали расширения в процентах
Я проработаю обработку первой неисправной строки:
echo strHomeFolder = oShell.ExpandEnvironmentStrings^(^"^%USERPROFILE^%^"^) >> uninstallBeta.vbs
Процент обработки в фазе 1 происходит раньше ^
обработка escape на этапе 2. Таким образом, анализатор ищет переменную среды с именем USERPROFILE^
и не может найти его. Так что это расширяется до пустой строки, оставляя:
echo strHomeFolder = oShell.ExpandEnvironmentStrings^(^"^^"^) >> uninstallBeta.vbs
Затем каретки обрабатываются для экранирования персонажей на втором этапе. Главное это первое ^"
является экранированной кавычкой, поэтому символы после не указываются. Следующий ^^
сбежавшая карета. Затем следует первая кавычка, которая не является экранированной, поэтому все символы после нее заключаются в кавычки. Я обозначаю это с Q над каждым цитируемым символом:
QQQQQQQQQQQQQQQQQQQQQQQ
echo strHomeFolder = oShell.ExpandEnvironmentStrings("^"^) >> uninstallBeta.vbs
Должно быть очевидно, почему >>
перенаправление не работает - оно заключено в кавычки, поэтому оно работает как строковый литерал.
Вы пытались избежать %
как ^%
чтобы предотвратить расширение переменной в партии. Это не работает. Правильнее всего удвоить проценты:
echo strHomeFolder = oShell.ExpandEnvironmentStrings("%%USERPROFILE%%") >> uninstallBeta.vbs
Если строка находится в блоке, заключенном в скобки, вам нужно будет экранировать )
, но (
никогда не нужно будет бежать
for .... do (
...
echo strHomeFolder = oShell.ExpandEnvironmentStrings("%%USERPROFILE%%"^) >> uninstallBeta.vbs
...
)
Обратите внимание, что правила отличаются от командной строки. Там нет механизма, чтобы действительно избежать %
в командной строке, и командная строка сохраняет %undefinedVar%
текст, если переменная не определена. Тем не менее, вы можете эффективно предотвратить расширение переменной, включив один или несколько ^
между процентами, чтобы переменная не была найдена. Затем каретка исчезает в фазе 2. Но первую цитату нужно экранировать, чтобы внутренняя ^
исчезает. И последняя кавычка должна быть экранирована, чтобы перенаправление было активным.
Это работает из командной строки (но не в пакетном скрипте):
echo strHomeFolder = oShell.ExpandEnvironmentStrings(^"%USERPROFILE^%^") >> uninstallBeta.vbs
Каретка может появляться где угодно между процентами. Все следующее будет работать так же хорошо:
%USER^PROFILE%
%^USERPROFILE%
etc.
Я попробовал это, и это работает как ожидалось тоже.....
set a=userprofile
set b=ProgramData
> uninstallBeta.vbs ECHO strHomeFolder = oShell.ExpandEnvironmentStrings^("%%%a%%%%"^)
>> %DESKTOP%\uninstallBeta.vbs ECHO strProgramData = oShell.ExpandEnvironmentStrings^("%%%b%%%%"^)
Я также новичок в пакетном написании сценариев. Я нашел, что это работает, пытаясь. надеюсь, кто-то объяснит, как это работает.