У меня есть командная строка, которая вызывается сторонним исполняемым файлом (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 команды:
Устанавливает некоторое программное обеспечение: powershell .\Install.ps1
Записывает, успешно ли установлено программное обеспечение: reg add "HKEY_CURRENT_USER\SOFTWARE\Foo\bar" /v "Installed" /d "%date:~4% %time%" /f /reg:64 > nul
Выводится в файл журнала в каталоге профиля пользователя: >> %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% ...
Примечание. Выполняемое стороннее программное обеспечение разрывается, если моя внешняя команда перенаправляет вывод (>>
), следовательно, дополнительный слой упаковки ...