2010-03-23 9 views
5

Take excruciatingly prosty plik wsadowy:administratora do pliku wsadowego z podwójnymi notowanych parametrów

echo hi 
pause 

Zapisz że TEST.BAT. Teraz skróć do test.bat. Skrót uruchamia plik wsadowy, który drukuje "hi", a następnie oczekuje na naciśnięcie klawisza zgodnie z oczekiwaniami. Teraz dodaj argument do celu skrótu. Teraz masz skrót do:

%path%\test.bat some args 

Skrót uruchamia plik wsadowy jak poprzednio.

Teraz uruchom skrót jako administrator. (Przy okazji jest to w systemie Windows 7). Możesz użyć prawego klawisza -> Uruchom jako administrator lub przejść do właściwości skrótu i ​​zaznaczyć pole w sekcji zaawansowanej. Poinformuj UAC, że jest w porządku i po raz kolejny skrót uruchamia plik wsadowy zgodnie z oczekiwaniami.

Teraz zmień argumenty w celu skrótu, aby dodać cudzysłów:

%path%\test.bat "some args" 

Teraz spróbuj skrót jako administrator. To nie działa tym razem! Pojawi się okno poleceń i znika zbyt szybko, aby zobaczyć jakikolwiek błąd. Próbowałem dodać> test.log 2> & 1 do skrótu, ale w tym przypadku nie jest tworzony żaden dziennik.

Spróbuj uruchomić ten sam skrót (z podwójnym cudzysłowem), ale nie jako Administrator. Uruchamia plik wsadowy dobrze. Wygląda więc na to, że zachowanie nie jest spowodowane podwójnymi parametrami, a nie dlatego, że działa jako Administrator. To dziwna kombinacja obu.

Próbowałem również uruchomić tę samą komendę w oknie poleceń administratora. Spowoduje to uruchomienie pliku wsadowego zgodnie z oczekiwaniami bez błędu. Uruchomienie skrótu z okna poleceń wywołało nowe okno poleceń, które błysnęło i odjechało. Najwyraźniej problem spowodowany jest kombinacją administratora, skrótu i ​​podwójnych cudzysłowów.

Jestem całkowicie zaskoczony, czy ktoś ma pojęcie, co się dzieje? Chciałbym również obejść.

+0

co zrobić, gdy uruchomisz faktyczne polecenie w wierszu poleceń. '% ścieżka% \ test.bat" niektóre argumenty "'. co widziałeś? – ghostdog74

+0

podczas uruchamiania z wiersza poleceń plik wsadowy drukuje "hi", a następnie czeka na naciśnięcie klawisza, jak można się było spodziewać. – XXB

Odpowiedz

5

Właśnie prowadził Process Monitor na ten temat i oto co zobaczyłam:

Uruchom jako użytkownik:

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

Uruchom jako admin:

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

z jakiegoś powodu, w biegu jako przypadek administratora nie cytuje całego polecenia. Wydaje się, że próbuje uruchomić polecenie:

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

Przypuszczam, że od pierwszego miejsca jest cytowany go rzeczywiście próbuje uruchomić następujące polecenie:

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

A Process Monitor loguje istnieje wpis systemu plików "BRAK TAKICH PLIKÓW" dla "C: \ Users \ Sunbelt \ Desktop \ test.bat some". Nie wiem, dlaczego jest inaczej, gdy uruchamiam jako Administrator, ale wydaje się, że to się dzieje.

+0

dobre informacje, ale chciałbym mieć trochę pracy ... – XXB

+0

Nie mogłem wymyślić, jak to zrobić. Próbowałem dodawać cytaty w różnych miejscach, ale albo okno dialogowe skrótów nie zaakceptowało tego wejścia, albo spowodowało dostęp do tego samego "BRAK TAKEGO PLIKU". – Luke

3

Aby obejść ten problem, należy utworzyć kolejny plik bat na ścieżce bez spacji, a wraz z nazwą pliku bez spacji, że po prostu to robi:

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

Ten wtórny plik bat można uruchomić jako administrator.

Możesz teraz utworzyć skrót do tego pliku dodatkowego dysku i sprawdzić, czy działa jako administrator w zaawansowanych opcjach skrótu. Skrót może być umieszczony na ścieżce ze spacjami i może zawierać nazwę pliku zawierającego spacje.

0

W moim przypadku chcę tylko przekazać jedną nazwę pliku jako parametr, ale ścieżka zawiera spacje.

Znalazłem rozwiązanie, które działało w tym przypadku (jeśli można skrócić nazwę pliku).

Utwórz kolejny plik bat (input_gate.bat), aby usunąć spacje na ścieżce, używając składni CALL.exe. Zakładając, że skrót jest nazwany test.lnk i jest na tej samej trasie, co input_gate.bat:

call %~sdp0test.lnk %~sf1 

To pass jako parametr do TEST.BAT pełną nazwę pliku w krótkim formacie, z uprawnieniami administratora.

  • % ~ sdp0 -> Czy aktualna ścieżka (dla input_gate.bat) w krótkim formacie.
  • % ~ SF1 -> Czy pierwszy parametr przekazany do input_gate.bat (w moim przypadku pełną nazwę pliku ze spacjami)
0

ten pracował dla mnie w systemie Windows 7:

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

Nie próbowałem to jeszcze jako administrator. Nie sądzę, że to działałoby, gdyby myscript.bat zawierał spacje.

0

W końcu to wymyśliłem, w sposób, który pozwala na użycie długich nazw plików (krótkie nazwy plików nie były odpowiednie dla mojego przypadku użycia). Moje rozwiązanie działa na Win 7, 8 i 10. Myślę, że zainspirowało go wspomnienie Luke'a o brakującym podwójnym cytacie.

Oto ona:

1.) dla skrótu utworzonego z pliku wsadowego, które można ustawić, aby uruchomić jako administrator, należy użyć następującego polecenia:

cmd /s /c ""path_to_batch_file" 

pamiętać, że istnieje są 2 cudzysłowami na początku polecenia, a tylko 1 na końcu, mimo że na końcu powinno być 2 również na końcu. Ale to jest sztuczka w doprowadzeniu do działania!

2.) W pliku wsadowym, dodać z powrotem brakujące cudzysłowu znak:

set user_file=%1" 


To jest to! Oto przykład, który pozwala zobaczyć to w akcji:

1.) Na pulpicie utwórz "test.bat”o następującej treści:.

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

3.) Utwórz skrót do pliku wsadowego ustawić go uruchomić jako administrator, i nadać mu następujące polecenie:

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

4.) przeciągnąć plik na skrótów Success (mam nadzieję ...)

Powiązane problemy