Администраторски пряк път към пакетен файл с параметри в двойни кавички

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

echo hi
pause

Запазете това като test.bat. Сега направете пряк път към test.bat. Пряк път стартира партидния файл, който отпечатва "hi" и след това чака натискане на клавиш, както се очаква. Сега добавете някакъв аргумент към целта на прекия път. Сега имате пряк път към:

%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
когато се изпълнява от командния ред, пакетният файл отпечатва hi и след това изчаква натискане на клавиш, както може да очаквате.   -  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"

По някаква причина случаят Run as Admin не цитира цялата команда. Изглежда, че се опитва да изпълни командата:

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

Предполагам, че тъй като първото пространство е цитирано, то всъщност се опитва да изпълни следната команда:

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

А в регистрационните файлове на Process Monitor има запис във файловата система „НЯМА ТАКЪВ ФАЙЛ“ за „C:\Users\Sunbelt\Desktop\test.bat some“. Не знам защо е различно, когато се стартира като администратор, но това е, което изглежда се случва.

person Luke    schedule 23.03.2010
comment
Не можах да разбера как да го направя. Опитах да добавя кавички на всякакви места, но или диалоговият прозорец за бърз достъп не приемаше това въвеждане, или това доведе до същите достъпи до НЯМА ТАКЪВ ФАЙЛ. - 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