Ярлык администратора для пакетного файла с параметрами в двойных кавычках

Возьмем мучительно простой командный файл:

echo hi
pause

Сохраните это как test.bat. Теперь сделайте ярлык для test.bat. Ярлык запускает пакетный файл, который печатает «привет», а затем ожидает нажатия клавиши, как и ожидалось. Теперь добавьте некоторый аргумент к цели ярлыка. Теперь у вас есть ярлык:

%path%\test.bat some args

Ярлык запускает пакетный файл, как и раньше.

Теперь запустите ярлык от имени администратора. (Кстати, это в Windows 7.) Вы можете либо щелкнуть правой кнопкой мыши -> «Запуск от имени администратора», либо перейти к свойствам ярлыка и установить флажок в расширенном разделе. Скажите UAC, что все в порядке, и ярлык снова запустит пакетный файл, как и ожидалось.

Теперь измените аргументы в цели ярлыка, чтобы добавить двойные кавычки:

%path%\test.bat "some args"

Теперь попробуйте ярлык от имени администратора. На этот раз не работает! Командное окно всплывает и исчезает слишком быстро, чтобы увидеть какую-либо ошибку. Я попытался добавить > test.log 2>&1 в ярлык, но в этом случае журнал не создается.

Попробуйте запустить тот же ярлык (с двойными кавычками), но не от имени администратора. Он отлично запускает командный файл. Таким образом, похоже, что такое поведение связано не с параметрами в двойных кавычках и не с тем, что он запускается от имени администратора. Какое-то странное сочетание этих двух вещей.

Я также попытался запустить ту же команду из командного окна администратора. Это запустило пакетный файл, как и ожидалось, без ошибок. Запуск ярлыка из командного окна породил новое командное окно, которое вспыхнуло и исчезло. Таким образом, очевидно, проблема вызвана комбинацией администратора, ярлыка и двойных кавычек.

Я в полном тупике, кто-нибудь знает, что происходит? Я также хотел бы обходной путь.


person XXB    schedule 23.03.2010    source источник
comment
как насчет того, когда вы запускаете реальную команду в командной строке. %path%\test.bat "some args". что ты видел?   -  person ghostdog74    schedule 23.03.2010
comment
при запуске из командной строки пакетный файл выводит приветствие, а затем ожидает нажатия клавиши, как и следовало ожидать.   -  person XXB    schedule 23.03.2010


Ответы (6)


Я только что запустил Process Monitor и вот что увидел:

Запуск от имени пользователя:

cmd /c ""C:\Users\Sunbelt\Desktop\test.bat" "some args""

Запуск от имени администратора:

"C:\Windows\System32\cmd.exe" /C "C:\Users\Sunbelt\Desktop\test.bat" "some args"

По какой-то причине в случае запуска от имени администратора не цитируется вся команда. Кажется, он пытается запустить команду:

C:\Users\Sunbelt\Desktop\test.bat" "some args

Я предполагаю, что, поскольку первый пробел заключен в кавычки, он фактически пытается запустить следующую команду:

"C:\Users\Sunbelt\Desktop\test.bat some" args

И в журналах Process Monitor есть запись файловой системы «NO SUCH FILE» для «C:\Users\Sunbelt\Desktop\test.bat какой-то». Я не знаю, почему это отличается при запуске от имени администратора, но, похоже, это происходит.

person Luke    schedule 23.03.2010
comment
Я не мог понять, как это сделать. Я пытался добавлять кавычки во всевозможные места, но либо диалоговое окно быстрого доступа не принимало этот ввод, либо это приводило к тому же обращению NO SUCH FILE. - person Luke; 23.03.2010

Чтобы обойти это, создайте еще один bat-файл по пути без пробелов и с именем файла без пробелов, который просто делает это:

call "Long path to original bat file\Original bat file.bat"

Этот вторичный bat-файл можно запустить от имени администратора.

Теперь вы можете создать ярлык для этого вторичного bat-файла и проверить запуск от имени администратора в дополнительных параметрах ярлыка. Ярлык может быть размещен на пути с пробелами, и он может иметь имя файла, содержащее пробелы.

person Kjell Rilbe    schedule 28.12.2011

В моем случае я просто хочу передать одно имя файла в качестве параметра, но в пути есть пробелы.

Я нашел решение, которое сработало для этого случая (если можно обрезать имя файла).

Создайте еще один bat-файл (input_gate.bat), чтобы удалить пробелы в пути, используя синтаксис CALL.exe. Предполагая, что ярлык называется test.lnk и находится на том же маршруте, что и input_gate.bat:

call %~sdp0test.lnk %~sf1

Это передает в качестве параметра для test.bat полное имя файла в коротком формате с правами администратора.

  • %~sdp0 -> Текущий путь (для input_gate.bat) в коротком формате.
  • %~sf1 ​​-> Первый параметр передается в input_gate.bat (в моем случае полное имя файла с пробелами)
person angelgarcan    schedule 14.07.2013

Это работало для меня в Windows 7:

ShortcutTarget: C:\Windows\System32\cmd.exe /C myscript.bat Param1 "Param Two with spaces"
StartIn:        "C:\Path containing\my script"

Под админом еще не пробовал. Я не думаю, что это сработало бы, если бы myscript.bat содержал пробелы

person FrinkTheBrave    schedule 26.02.2016

Я, наконец, понял это таким образом, чтобы можно было использовать длинные имена файлов (короткие имена файлов не подходили для моего варианта использования). Мое решение работает на Win 7, 8 и 10. Я думаю, что оно было вдохновлено упоминанием Люка об отсутствующей двойной кавычке.

Вот:

1.) Для ярлыка, который вы создаете для пакетного файла, который вы настроили для запуска от имени администратора, используйте следующую командную строку:

cmd /s /c ""path_to_batch_file"

Обратите внимание, что в начале команды есть 2 символа двойных кавычек, а в конце только 1, хотя должно обычно быть 2 и в конце. Но в этом вся хитрость, чтобы заставить его работать!

2.) В пакетном файле добавьте отсутствующий символ двойной кавычки:

set user_file=%1"


Вот и все! Вот пример, чтобы вы могли увидеть это в действии:

1.) На рабочем столе создайте «test.bat» со следующим содержимым:

@echo off
set user_file=%1"
echo The file is: %user_file%
pause

3.) Создайте ярлык для пакетного файла. Установите его для запуска от имени администратора и введите следующую командную строку:

cmd /s /c ""%userprofile%\desktop\test.bat"

4.) Перетащите файл на ярлык. Успех! (Я надеюсь...)

person JohnK    schedule 18.10.2017

Ответ здесь сработал для меня: https://superuser.com/questions/931003/passing-variables-with-space-to-the-command-line-as-admin

Который...

Добавление cmd /C перед целью. Я также должен был убедиться, что в имени и пути моего сценария нет пробелов, и not указать путь к сценарию в кавычках в target.

person David    schedule 30.01.2018