2016-03-14 9 views
9

Windows interprete dei comandi include un comando FOR, che è in grado di analizzare l'output di un dato comando ed eseguire il ciclo per ciascuna linea di uscita, ad esempio:Come specificare/D nel comando FOR?

FOR /F %%i IN ('DIR .') DO echo %i # Outputs each file name 

viene eseguito il comando (DIR .) in una riga di comando figlio tramite cmd /C <command> <command-arguments>, tuttavia, il parametro /D non è specificato ... questo porta a comportamenti strani se l'utente ha un comando AutoRun con output (ad esempio echo o cls).

C'è un modo per forzare FOR per eseguire il comando tramite cmd /C /D <command> <command-arguments>?

+5

Una soluzione molto semplice consiste nell'utilizzare un file intermedio anziché un comando: 'DIR. > DIR.txt' & 'FOR/F %% i IN (DIR.txt) DO echo %% i' – Aacini

risposta

4

una soluzione molto semplice per il vostro problema è utilizzare un filenel comando for /F invece di un comando . In questo modo, emuliamo semplicemente l'operazione interna di for /F su un comando, ma eseguiamo esplicitamente ciascun passaggio: 1. Esegui il comando e memorizza l'output in un file di testo temporaneo. 2. Elabora tutte le righe nel file temporaneo. 3. Elimina il file.

DIR . > TempFile.txt 
FOR /F %%i IN (TempFile.txt) DO echo %%i 
DEL TempFile.txt 
+2

Ottima idea e semplice da implementare. – dbenham

6

Si è imbattuto in uno dei numerosi difetti di progettazione di cmd.exe e questo mi ha infastidito per un po 'di tempo. Sono abbastanza sicuro che non c'è modo di sopprimere AutoRun quando FOR/F esegue un comando.

Ciò che rende particolarmente irritante è che i tubi utilizzano anche CMD/C (uno per ciascun lato del tubo), ma i progettisti della pipa erano abbastanza intelligenti da incorporare entrambe le opzioni/D e/S. È davvero un peccato che i progettisti di FOR/F non abbiano potuto fare lo stesso.

Credo che la tua unica risorsa Un'opzione deve essere difensiva all'interno della definizione del comando AutoRun. Suggerisco di mettere tutti i comandi di esecuzione automatica all'interno di uno script batch che ha qualcosa come il seguente in alto:

@echo off 
if defined AutoRunComplete exit /b 
set AutoRunComplete=1 
REM Put your AutoRun commands below... 

Ma se non è possibile controllare i comandi AutoRun, poi penso che tu sei fuori di fortuna. Aacini's idea of using a temporary file to get around the problem è una soluzione efficace e semplice.

+0

Grazie per il tuo commento - sfortunatamente, non riesco a controllare il file AutoRun, il problema si è verificato in un sito del cliente e volevo essere sicuro che non potessimo più incappare nella stessa situazione in futuro. Sai per caso qualche problema con MS Connect che discute il problema? –

+3

@ D.R. - Il meglio che ho trovato è su https://blogs.msdn.microsoft.it/oldnewthing/20071121-00 /? p = 24433 – dbenham

2

Quando si dispone di molti FOR/F blocchi per analisi output del programma, allora potrebbe essere utile aggiungere un wrapper cmd.exe.

Questo involucro può essere installato con

set "comspec=C:\somewhere\cmdWrapper.exe" 
FOR /F %%i IN ('DIR .') DO echo %%i 

Il wrapper stessa deve avviare il cmd.exe originale con /D /C.

Ma il comportamento dello comspec variable è un po 'strano.

+0

Un'altra idea interessante. Suppongo che potresti implementare il wrapper con CSCRIPT. Ma il comportamento "strano" in cui cmd FOR/F memorizza nella cache il valore COMSPEC rende la tecnica inaffidabile. Non vedo come sia possibile controllare se il tuo script è il primo che utilizza FOR/F. – dbenham

+0

Ho già provato CSRIPT, ma fallisce perché non accetta l'opzione '/ C'. Attualmente sto giocando con i file '.hta' per mshta, ma non riesco a farlo funzionare, come sembra, che solo .exe siano validi per' comspec' ma non per associazioni di file – jeb