Запись выхода ECHO в файл VBS не работает

1187
A Child of God

Я пишу 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-скриптов, которые, я думаю, отлично работают, делая это таким образом. Я проверил на опечатки и не нашел ни одного. Он прекрасно работает в командной строке, но не в пакетном скрипте.

4
Я нашел [решение] (https://ss64.com/nt/syntax-redirection.html), которое исправляет его, но я все еще хочу знать, почему это произошло. A Child of God 6 лет назад 0
Возможно, вы захотите посмотреть на https://stackoverflow.com/a/9074483/1012053, особенно в разделе *** UPDATE 2014-04-27 *** внизу, метод, позволяющий полностью избежать создания отдельного файла VBS. , Вы действительно можете запустить VBS непосредственно в пакетном скрипте! dbenham 6 лет назад 0
@dbenham Я видел это вчера, прежде чем кто-нибудь ответил. В рассмотрю попробовать это. A Child of God 6 лет назад 0

2 ответа на вопрос

7
dbenham

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

Должно быть очевидно, почему >>перенаправление не работает - оно заключено в кавычки, поэтому вместо этого оно работает как строковый литерал.

Вы попытались выйти из %as, ^%чтобы предотвратить расширение переменной в пакете. Это не работает. Правильнее всего удваивать проценты:

echo strHomeFolder = oShell.ExpandEnvironmentStrings("%%USERPROFILE%%") >> uninstallBeta.vbs 

Если строка находится в блоке, заключенном в скобки, вам нужно будет экранировать ), но (экранировать не нужно

for .... do ( ... echo strHomeFolder = oShell.ExpandEnvironmentStrings("%%USERPROFILE%%"^) >> uninstallBeta.vbs ... ) 

Обратите внимание, что правила отличаются от командной строки. Не существует механизма, позволяющего по-настоящему экранировать a %в командной строке, и командная строка сохраняет %undefinedVar%текст, если переменная не определена. Однако вы можете эффективно предотвратить расширение переменной, включив один или несколько ^процентов, чтобы переменная не была найдена. Затем каретка исчезает в фазе 2. Но первую цитату нужно экранировать, чтобы ^исчезло внутреннее . И последняя кавычка должна быть экранирована, чтобы перенаправление было активным.

Это работает из командной строки (но не в пакетном скрипте):

echo strHomeFolder = oShell.ExpandEnvironmentStrings(^"%USERPROFILE^%^") >> uninstallBeta.vbs 

Каретка может появиться где угодно между процентами. Все следующее будет работать так же хорошо:

%USER^PROFILE% %^USERPROFILE% etc. 
@Facebook - Понятия не имею, о какой ситуации ты говоришь. Мне бы пришлось увидеть конкретный пример. Если вы выясните точный неприятный сценарий, то опубликуйте новый вопрос, либо здесь, либо в StackOverflow. dbenham 6 лет назад 0
Вот он, человек .... https://superuser.com/questions/1261588/batch-script-parenthesized-echo-of-the-word-where-issue Pimp Juice IT 6 лет назад 0
2
TahaEltahawy

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

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

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

Посмотрите ответ Дбенхэма, почему это работает. A Child of God 6 лет назад 0