Questa è la risposta originale. Si prega di leggere sotto la linea per un'analisi completa del problema e un modo migliore per risolverlo
Luogo due spazi tra il comando ed i suoi argomenti
forfiles /c "ping /a"
a cura Mentre la soluzione postato funziona per la domanda OP, non è una risposta completa, in quanto vi sono alcuni casi in cui questa opzione non funziona.
Perché?
Ho iniziato a eseguire il debug delle routine di parsing dell'argomento forfiles
pensando che il problema riguardi il modo in cui la stringa di comando viene analizzata e convertita per generare il comando di esecuzione finale.
No, funziona senza alcun problema
La causa del problema è nella chiamata alla funzione API CreateProcess
e il modo in cui le opere di argomento parser C e come i programmatori di solito trattano gli argomenti.
forfiles
chiama l'API come
CreateProcess('c:\windows\system32\ping.exe','/a', ....)
Cioè, il nome dell'applicazione e gli argomenti ad esso. Bello e pulito, ma problematico, perché il primo argomento per l'applicazione è /a
Dov'è il problema? Nel primo argomento. La normale gestione degli argomenti in quasi tutti i programmi presuppone che il primo argomento del programma sia il programma stesso (almeno il suo nome), ovvero, argv[0]
è il nome del programma.
Ma perché comportarsi in quel modo, la chiamata a CreateProcess
da forfiles
dovrebbe essere uno qualsiasi dei
CreateProcess('c:\windows\system32\ping.exe','ping.exe /a', ....)
CreateProcess(NULL, 'c:\windows\system32\ping.exe /a', ....)
Come quasi di programmazione tutti in C (e in molte più lingue che seguono la stessa convenzione) si aspetta che argv[0]
(tabella valore valore argomenti prima posizione) sarà il nome del programma e (tabella valore argomenti, seconda posizione) sarà il primo argomento e, poiché questo non è il caso nei processi avviati forfiles
, il primo argomento verrà ignorato perché il il primo argomento reale verrà memorizzato in argv[0]
, non argv[1]
Quindi, il comportamento corretto o l'errore dipenderà dal parser/lexer/tokenizer utilizzato dal programma chiamato.
Alcuni di loro vedranno lo spazio aggiunto come argomento adizionale che verrà memorizzato all'interno argv[0]
(il tokenizzatore standard MinGW/GCC e VC comportarsi in questo modo).
Altri saranno rimuovere gli spazi e prendere i primi dati non vuoti come argv[0]
(il caso di find
)
qualsiasi altro comportamento che si può pensare può essere adottato dal tokenizer.
E una volta che il tokenizzatore ha terminato il suo lavoro, il programma gestirà gli argomenti e selezionare una delle
Quindi, la soluzione spazio non è una soluzione a prova di proiettile (grazie dbenham)
Come risolverlo?
Poiché il problema è l'ausence del nome del programma nell'argomento della riga di comando e la posizione errata dei seguenti argomenti, l'opzione migliore sembra includerla (beh, possiamo includere qualsiasi cosa da utilizzare come argv[0]
, ma come maggior parte dei programmi si aspettano il nome del programma ...)
forfiles /c "ping ping -a"
forfiles /c "find find /c /v 0x220x22 @path"
Evitare i fastidi ei dettagli esoterici e utilizzare invece PowerShell. –
@Bill_Stewart questo è per quando PowerShell è rotto http://serverfault.com/a/645113 –