сбой при запуске пакетного файла от имени администратора, если каталог содержит символ «

#windows #batch-file

#Windows #пакетный файл

Вопрос:

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

например, в каталоге: «C:tempJack amp; Dianne», Создайте run.bat:

 @ECHO OFF
ECHO Hello
PAUSE
  

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

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

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

Комментарии:

1. Это вызовет проблемы при использовании других функций batch. Я использую вместо amp; .

2. Не уверен, но, возможно, /S опция могла бы помочь в определении runas глагола: %SystemRoot%System32cmd.exe /S /C "%1" %*

3. @eryksun, да, вы правы, я не имел в виду точные правила, извините за путаницу…

Ответ №1:

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

Способ реализации глагола «runas» требует наличия исполняемого файла в команде template, поэтому они явно задают для него значение %SystemRoot%System32cmd.exe /C "%1" %* . При этом забывается заключить в кавычки всю командную строку. Измените его на следующее:

 `%SystemRoot%System32cmd.exe /C ""%1" %*"`. 
  

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

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