2010-03-23 14 views
5

Prendete un atrocemente semplice file batch:dell'amministratore di file batch con parametri doppie citati

echo hi 
pause 

Salva che, come test.bat. Ora, crea una scorciatoia per test.bat. Il collegamento esegue il file batch, che stampa "ciao" e quindi attende una pressione del tasto come previsto. Ora aggiungi alcuni argomenti alla destinazione del collegamento. Ora hai una scorciatoia per:

%path%\test.bat some args 

Il collegamento esegue il file batch come prima.

Ora, eseguire la scorciatoia come amministratore. (Questo è anche su Windows 7.) È possibile utilizzare il tasto destro del mouse -> Esegui come amministratore, oppure andare alle proprietà del collegamento e selezionare la casella nella sezione avanzata. Informa UAC che va bene e ancora una volta il collegamento esegue il file batch come previsto.

Ora, modificare gli argomenti nella destinazione del collegamento per aggiungere le virgolette:

%path%\test.bat "some args" 

Ora provare il collegamento come amministratore. Non funziona questa volta! Una finestra di comando si apre e scompare troppo velocemente per vedere qualsiasi errore. Ho provato ad aggiungere> test.log 2> & 1 al collegamento, ma in questo caso non viene creato alcun registro.

Provare a eseguire lo stesso collegamento (con virgolette doppie) ma non come amministratore. Esegue bene il file batch. Quindi, sembra che il comportamento non sia dovuto ai doppi parametri citati, e non perché sia ​​eseguito come amministratore. È una strana combinazione dei due.

Ho anche provato a eseguire lo stesso comando dalla finestra di comando di un amministratore. Questo ha eseguito il file batch come previsto senza errori. L'esecuzione del collegamento dalla finestra di comando generava una nuova finestra di comando che lampeggiava e andava via. Quindi a quanto pare il problema è causato da una combinazione di amministratore, la scorciatoia e le doppie virgolette.

Sono totalmente perplesso, qualcuno ha idea di cosa sta succedendo? Mi piacerebbe anche una soluzione.

+0

cosa dire quando si esegue il comando effettivo sulla riga di comando. '% percorso% \ test.bat" alcuni argomenti "'. che cosa hai visto? – ghostdog74

+0

quando si esegue dalla riga di comando, il file batch stampa "ciao" e quindi attende la pressione di un tasto, come ci si potrebbe aspettare. – XXB

risposta

5

Ho appena eseguito Process Monitor su questo e qui è quello che ho visto:

Esegui come utente:

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

Esegui come amministratore:

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

Per qualche ragione, la Run come il caso Amministratore non sta citando l'intero comando. Sembra che stia cercando di eseguire il comando:

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

Direi che dal momento che il primo spazio è citato in realtà il tentativo di eseguire il seguente comando:

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

E in Process Monitor registra c'è una voce del file system "NO SUCH FILE" per "C: \ Users \ Sunbelt \ Desktop \ test.bat alcuni". Non so perché è diverso quando viene eseguito come amministratore, ma è quello che sembra stia accadendo.

+0

buone informazioni, ma mi piacerebbe avere una sorta di lavoro in giro ... – XXB

+0

Non riuscivo a capire come farlo. Ho provato ad aggiungere citazioni in tutti i tipi di posti, ma la finestra di scelta rapida non accettava quell'input o aveva come risultato gli stessi accessi "NO SUCH FILE". – Luke

3

Per risolvere questo, creare un altro file bat su un percorso senza spazi, e con un nome senza spazi, che fa semplicemente questo:

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

Questo file bat secondaria può essere eseguito come amministratore.

È ora possibile creare un collegamento a questo file bat secondario e controllare l'esecuzione come amministratore nelle opzioni avanzate del collegamento. La scorciatoia può essere posizionata su un percorso con spazi e può avere un nome file contenente spazi.

0

Nel mio caso voglio solo passare un nome di file come parametro, ma il percorso ha spazi.

Ho trovato una soluzione che ha funzionato per questo caso (se questo è ok per troncare il nome del file).

Creare un altro file bat (input_gate.bat) per rimuovere gli spazi nel percorso utilizzando la sintassi di CALL.exe. Supponendo che il collegamento si chiama test.lnk ed è sullo stesso percorso come l'input_gate.bat:

call %~sdp0test.lnk %~sf1 

Questo pass come parametro per test.bat il nome del file completo in formato breve, con privilegi di amministratore.

  • % ~ sdp0 -> È il percorso corrente (per input_gate.bat) in formato breve.
  • % ~ SF1 -> è il primo parametro passato a input_gate.bat (nel mio caso il nome completo del file con spazi)
0

Questo ha funzionato per me in Windows 7:

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

non provato ancora come amministratore. Non penso che funzionerebbe se myscript.bat contenesse spazi

0

Finalmente l'ho capito, in un modo che permette l'uso di nomi di file lunghi (i nomi brevi non erano adeguati per il mio caso d'uso). La mia soluzione funziona su Win 7, 8 e 10. Penso che sia stato ispirato dalla menzione di Luca sulla doppia citazione mancante.

Eccolo:

1.) Per il collegamento che si crea al file batch, che si imposta per l'esecuzione come amministratore, utilizzare la seguente riga di comando:

cmd /s /c ""path_to_batch_file" 

noti che ci sono 2 caratteri di virgoletta all'inizio del comando e solo 1 alla fine, anche se lo dovrebbe essere normalmente alla fine anche 2. Ma questo è il trucco per farlo funzionare!

2.) Nel file batch, aggiungere di nuovo il doppio apice mancante:

set user_file=%1" 


Questo è tutto! Ecco un esempio per vederlo in azione:

1.) Sul desktop, creare "test.bat" con il seguente contenuto:.

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

3.) Creare un collegamento al file batch impostare per eseguire come amministratore, e dargli la seguente riga di comando:

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

4.) trascinare un file sul collegamento Success (spero ...)

Problemi correlati