Я пишу пакетный файл Windows, который автоматически расширяет себя до административных разрешений, если пользователь нажимает «Да» в появившемся диалоговом окне «Управление доступом пользователя».
Я использую метод, который я изучил здесь, чтобы определить, есть ли у нас уже права администратора, а другой - от здесь для эскалации. Когда это уместно, следующий скрипт, назовем его foo.bat
, повторно запускает себя через вызов runas
, опосредованный powershell:
@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
, которые составляют замену %*
с соответствующим экранированием. Однако даже в этом статическом примере каждый шаблон выхода, который я пробовал до сих пор, либо терпел неудачу (я вижу Second argument is "two"
, а не Second argument is "two three"
), либо вызывал ошибку (обычно Start-Process: A positional parameter cannot be found that accepts argument 'two'
). Использование документов для Powershell Start-Process я пробовал всевозможные нелепые комбинации кавычек, знаков вставки, двойных и тройных кавычек, обратных кавычек и запятых, но между цитированием пакетного файла и цитированием powershell происходит какое-то нечестивое взаимодействие, и ничего сработало.
Это вообще возможно?
Second argument is "two"
, а не желаемоеSecond argument is "two three"
- person jez   schedule 13.02.2019goto :eof
должен отсутствовать или каким-то образом его игнорируют. Упс, его нет в моем списке в вопросе, поэтому — отредактировано. Важно то, какие аргументы у экземпляра командного файла с повышенными правами, и они должны быть такими же, как и в версии без повышенных прав. - person jez   schedule 13.02.2019%~dpfx0
? Я думаю, вам нужен полный путь, поэтому%~dpnx0
в длинной форме или%~f0
в более компактной... - person aschipfl   schedule 13.02.2019