Откладывание раскрытия в командной строке Windows с помощью вложенных команд - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть командная строка, которая вызывается сторонним исполняемым файлом (Intune Management Extension). К сожалению, этот исполняемый файл предпочитает раскрывать переменные среды в моей командной строке перед их выполнением. Кроме того, он не загружает системные переменные окружения до того, как выполнит это расширение.

Итак, если я добавлю что-то подобное в командную строку, оно ничего не решит:

cmd /s /c "echo profile is: %userprofile%"
profile is:

I Я обнаружил, что могу обойти проблему, используя отложенное расширение следующим образом:

cmd /s /v /c "echo profile is: !userprofile!"

Однако в моем реальном сценарии это не так:

cmd /s /v /c "cmd /s /v /c "cmd /s /v /c "echo hello" > !userprofile!\tst.log""
The system cannot find the path specified.

однако как ни странно, это работает:

cmd /s /v /c "cmd /s /v /c "echo hello" > !userprofile!\tst.log"

Может кто-нибудь объяснить мне, почему дополнительный уровень вложенности нарушает это?

Альтернативный приемлемый ответ на этот вопрос: как я могу взять произвольную последовательность допустимых командных строк, безопасно объединить их в единую цепочку команд (используя &&) и перенаправить вывод всех из них в выходной файл журнала? Имейте в виду, мое ограничение заключается в том, что это стороннее программное обеспечение, которое может выполнять одну командную строку.

Пример из реальной жизни - у меня есть 3 команды:

  1. Устанавливает некоторое программное обеспечение: powershell .\Install.ps1

  2. Записывает, успешно ли установлено программное обеспечение: reg add "HKEY_CURRENT_USER\SOFTWARE\Foo\bar" /v "Installed" /d "%date:~4% %time%" /f /reg:64 > nul

  3. Выводится в файл журнала в каталоге профиля пользователя: >> %userprofile%\tst.log

Как я могу объединить это в одну командную строку?

Прямо сейчас у меня есть

cmd /s /c "cmd /s /c "cmd /s /c "powershell .\Install.ps1" && reg add "HKEY_CURRENT_USER\SOFTWARE\Foo\bar" /v "Installed" /d "%date:~4% %time%" /f /reg:64 > nul" >> "%userprofile%\install.log" 2>&1"

Это работает, за исключением раннего расширения% userprofile% ...

Примечание. Выполняемое стороннее программное обеспечение разрывается, если моя внешняя команда перенаправляет вывод (>>), следовательно, дополнительный слой упаковки ...

1 Ответ

0 голосов
/ 20 апреля 2020

Специальные символы в командной строке: %, &, > и !. Некоторым из этих персонажей может потребоваться экранировать, чтобы отложить их использование. Если присутствует в строке, то есть ">", то это может сделать их буквальными или, если cmd удаляет окружающие "" из командной строки, может просто отложить их специальное действие, если они больше не являются частью строки.

Может сбежать % с удвоением или более, если необходимо, т.е. %%. &, > и ! могут быть экранированы с помощью каретки ^, если это необходимо. % и ! могут оставаться особенными в строках. Представление ss64.com о Escape-символах, разделителях и кавычках в командной строке Windows .

В OP вы попытались отложить расширение с использованием cmd /v и заменив % на !.

Вы также пытались вложить команды cmd с максимум 3 экземплярами.

Рассмотрите пример 1:

cmd /c echo 1 && echo 2 > file.txt 2>&1

Ожидается:

  • cmd /c echo 1 будет выполнено.
  • echo 2 > file.txt 2>&1 будет выполнено, если уже в процессе cmd.

Рассмотрим пример 2 :

cmd /c (echo 1 ^&^& echo 2) > file.txt 2>&1

Ожидается:

  • cmd /c (echo 1 ^&^& echo 2) > file.txt 2>&1 будет записывать строку 1 (+ Пробел ) и строку 2 до file.txt , && задерживается на предшествующий ^ перед каждым символом, а вывод echo группируется по (), так что file.txt получает весь вывод.

Фактическая команда, которую нужно попробовать :

cmd /v /c (powershell -file .\Install.ps1 ^&^& reg add "HKCU\SOFTWARE\Foo\bar" /v "Installed" /d "!date:~4! !time!" /f /reg:64 ^> nul) >> "!userprofile!\install.log" 2>&1

У меня нет или я раньше использовал Intune Management Extension , чтобы быть уверенным в успехе. Использование cmd /v и ! вместо % основано на ваших результатах тестирования и c.

...