Это помогает понять, как cmd.exe анализирует пакетные сценарии:
Часть 1 - Обзор
Часть 2 - Детали расширения в процентах
Я проработаю обработку первой неисправной строки:
echo strHomeFolder = oShell.ExpandEnvironmentStrings^(^"^%USERPROFILE^%^"^) >> uninstallBeta.vbs
Обработка Процент в фазе 1 происходит перед обработкой ^
эвакуацией фазы 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.