Стандартная команда «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 удаляет только лишние кавычки вместо кавычек, которые могут понадобиться, чтобы избежать пробелов и специальных символов в пути или аргументах сценария.