Я пишу пакетный файл Windows, который автоматически переходит в административные полномочия при условии, что пользователь нажимает «Да» в открывшемся диалоговом окне «Контроль доступа пользователей».
Я использую методику, которую я выучил здесь , чтобы определить, есть ли у нас уже права администратора, и еще одно из , здесь для повышения.Когда это уместно, следующий сценарий, назовем его foo.bat
, перезапускает себя через посредство powershell-вызова runas
:
@echo off
net session >NUL 2>NUL
if %ERRORLEVEL% NEQ 0 (
powershell start -wait -verb runas "%~dpfx0" -ArgumentList '%*'
goto :eof
)
echo Now we are running with admin rights
echo First argument is "%~1"
echo Second argument is "%~2"
pause
Моя проблема заключается в экранировании кавычек в -ArgumentList
.Приведенный выше код прекрасно работает, если я вызываю foo.bat one two
из командной строки, но не если один из аргументов содержит пробел, например, как в foo.bat one "two three"
(где второй аргумент должен быть двумя словами, «два три»).
Если бы я мог просто получить соответствующее поведение при замене %*
статическими аргументами:
powershell start -wait -verb runas "%~dpfx0" -ArgumentList 'one "two three"'
, тогда я мог бы добавить несколько строк в foo.bat
, которые составляют соответственно экранированныйзаменить %*
.Однако даже в этом статическом примере каждый шаблон escape, который я пробовал до сих пор, либо не выполнялся (я вижу Second argument is "two"
, а не Second argument is "two three"
), либо вызывал ошибку (обычно Start-Process: A positional parameter cannot be found that accepts argument 'two'
).Опираясь на документы для Start-Process PowerShell Я испробовал всевозможные смешные комбинации кавычек, кареток, двойных и тройных кавычек, обратных кавычек и запятых, но между цитированием пакетного файла происходит какое-то нечестивое взаимодействиеи цитирование powershell, и ничего не сработало.
Возможно ли это вообще?