Ярлык администратора для пакетного файла с параметрами в двойных кавычках - PullRequest
5 голосов
/ 23 марта 2010

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

echo hi
pause

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

%path%\test.bat some args

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

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

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

%path%\test.bat "some args"

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

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

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

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

Ответы [ 6 ]

5 голосов
/ 23 марта 2010

Я только что запустил 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 some». Я не знаю, почему при запуске с правами администратора это не так, но похоже, что это и происходит.

3 голосов
/ 28 декабря 2011

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

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

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

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

0 голосов
/ 30 января 2018

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

Что такое ...

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

0 голосов
/ 18 октября 2017

Я наконец понял это таким образом, что это позволяет использовать длинные имена файлов (короткие имена файлов не подходят для моего варианта использования). Мое решение работает на 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.) Перетащите файл на ярлык. Успех! (Надеюсь ...)

0 голосов
/ 27 февраля 2016

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

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

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

0 голосов
/ 14 июля 2013

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

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

Создайте другой файл 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 (в моем случае полное имя файла с пробелами)
...