Мне нужно выполнить команду PS через runas.exe. Команда PS работает отдельно, но я не могу заставить ее работать как вызов runas.exe. Кажется, проблема с экранированием, но кавычки + двойные кавычки здесь почему-то не работают :(
Оригинальная команда:
runas.exe /savecred /user:user "cmd.exe /k powershell -Command "& {echo 123}""
Спасибо!





:: From cmd.exe
runas.exe /savecred /user:user "powershell -NoExit -Command \"^& { echo 123 }\""
Нет необходимости звонить через cmd /k — передача -NoExit в powershell.exe напрямую сохраняет сеанс открытым.
Встроенная " внутри вашей общей строки "..." должна быть экранирована, как \"
cmd.exe - в отличие от runas.exe - не распознает \" как экранированное " и поэтому считает его замыкающим " для внешнего начала ", в результате чего считает & находящимся снаружи "...", что вызвало бы интерпретацию как cmd.exe оператор последовательности операторов. Побег & as ^& позволяет избежать этого.cmd.exe, такие как |, тоже должны быть экранированы ^.Вы можете избежать или уменьшить потребность в ^-экранировании, воспользовавшись тем фактом, что powershell.exe, интерфейс командной строки Windows PowerShell, также позволяет передавать компоненты командной строки в виде отдельных аргументов, то есть без общего "..." включения :
:: From cmd.exe.
:: No embedded "..." enclosure for the -Command arguments -> no need to ^-escape &
runas.exe /savecred /user:user "powershell -NoExit -Command & { echo 123 }"
Кроме того, обратите внимание, что вам не нужно & { ... } вокруг команды, которую вы передаете -Command — просто используйте команду напрямую:
:: From cmd.exe.
:: No need for & { ... }
runas.exe /savecred /user:user "powershell -NoExit -Command echo 123"
Тем не менее, вы все еще можете столкнуться с синтаксическим анализом cmd.exe, а именно, когда самой команде PowerShell требуются символы " (в отличие от использования " просто синтаксически для начальной командной строки):
Следующее заставляет PowerShell печатать дословно 3" of snow & more:
runas.exe /savecred /user:tu1 "powershell -NoExit -Command echo '3\\\" of snow ^& more'"
Обратите внимание на необходимость двойного экранирования символа " (\\\", чтобы сначала экранировать для runas.exe, а затем для powershell.exe), и снова на необходимость ^-экранирования & в пользу cmd.exe.
Вы захватывает дух!