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