запуск командного файла с правами администратора завершается неудачей, если в каталоге есть символ "&" - PullRequest
3 голосов
/ 14 марта 2019

Чтобы воспроизвести проблему, создайте простой командный файл в каталоге, в котором есть «&».

например, в каталоге: «C: \ temp \ Jack & Dianne», создайте файл run.bat:

@ECHO OFF
ECHO Hello
PAUSE

В проводнике Windows щелкните правой кнопкой мыши и выберите «Запуск от имени администратора».Пакетный файл не работает должным образом.То есть: после того, как я нажму «Да» в диалоговом окне «Контроль учетных записей» Windows, окно командной строки на мгновение вспыхнет, а затем исчезнет.

Если я переименую каталог, чтобы удалить «&», то пакетный файл работает нормально.Я могу воспроизвести проблему в Windows 10, но подозреваю, что это будет общая проблема Windows.

Может кто-нибудь пролить свет?

1 Ответ

2 голосов
/ 14 марта 2019

Стандартная команда «open» для файлов .bat и .cmd использует "%1" %* в качестве команды шаблона. (Эта команда определяется программами batfile и cmdfile в разделе «HKLM \ Software \ Classes» в соответствующем подразделе «shell \ open \ command».) Эта команда шаблона не включает исполняемый файл оболочки, только целевой скрипт ("%1") и параметры (*%). Построение последней командной строки, которая выполняет оболочку %ComSpec%, остается до вызова CreateProcess[AsUser]W, который также добавляет правильное цитирование.

Для реализации глагола "runas" требуется исполняемый файл в команде шаблона, поэтому они явно устанавливают его на %SystemRoot%\System32\cmd.exe /C "%1" %*. Это забывает процитировать всю командную строку. Измените его на следующее:

`%SystemRoot%\System32\cmd.exe /C ""%1" %*"`. 

Чтобы понять, почему необходимо дополнительное цитирование, прочитайте справку cmd /? для опции /C. Таким образом, опция /C сохраняет кавычки вокруг пути сценария %1, только если командная строка соответствует следующим критериям: нет опции /S и ровно две кавычки, которые разграничивают строку, содержащую один или несколько пробельных символов и не специальные символы (&<>()@^|) и это имя исполняемого файла.

Из-за символа & в пути CMD прибегает к своему обычному поведению, которое удаляет начальную и последнюю кавычки. Если ничто не было перетащено на иконку (т. Е. Нет %*), это будут кавычки вокруг пути сценария %1. С помощью всей командной строки в кавычках CMD удаляет только лишние кавычки вместо кавычек, которые могут понадобиться, чтобы избежать пробелов и специальных символов в пути или аргументах сценария.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...