4

Я пишу 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%")

Но происходит то, что пакетный скрипт просто повторяет всю строку, включая >> uninstallBeta.vbs . Есть идеи, почему это происходит? У меня есть похожие строки для создания других VBS и Batch-скриптов, которые, я думаю, отлично работают, делая это таким образом. Я проверил на опечатки и не нашел ни одного. Он прекрасно работает в командной строке, но не в пакетном скрипте.

2 ответа2

7

Это помогает понять, как 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.
2

Я попробовал это, и это работает как ожидалось тоже .....

set a=userprofile
set b=ProgramData
> uninstallBeta.vbs ECHO strHomeFolder = oShell.ExpandEnvironmentStrings^("%%%a%%%%"^)
>> %DESKTOP%\uninstallBeta.vbs ECHO strProgramData = oShell.ExpandEnvironmentStrings^("%%%b%%%%"^)

Я также новичок в пакетном написании сценариев. Я нашел, что это работает, пытаясь. надеюсь, кто-нибудь объяснит, как это работает.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .