Equivalente batch di backtick di Bash


Risposte:


53

Puoi farlo reindirizzando prima l'output a un file. Per esempio:

echo zz > bla.txt
set /p VV=<bla.txt
echo %VV%

16
Richiede di trovare una posizione in cui si dispone dell'accesso in scrittura per memorizzare il file temporaneo; devi pulire dopo te stesso; questo stesso esempio consente di leggere solo la prima riga di input. Per tutti gli scopi pratici la for /fvariante è molto migliore.
Joey

@grawity - insieme a%random%
bacar

1
@joey Legge ogni riga, ma come concatenarsi a un argomento della riga di comando in un singolo comando.
user877329

come gestisce le nuove righe?
andrewrk

103

È possibile ottenere una funzionalità simile utilizzando gli script cmd.exe con il for /fcomando:

for /f "usebackq tokens=*" %%a in (`echo Test`) do my_command %%a

Sì, è un po 'non ovvio (per non dire altro), ma è quello che c'è.

Vedere for /? per i dettagli cruenti.

Nota a margine: pensavo che per usare " echo" all'interno dei backtick in un " for /f" comando sarebbe stato necessario utilizzare " cmd.exe /c echo Test" poiché echoè un comando interno per cmd.exe, ma funziona in modo più naturale. Gli script batch di Windows mi sorprendono sempre in qualche modo (ma di solito non in modo positivo).


2
Di solito devi farlo quando esegui i comandi incorporati della shell da programmi esterni che non generano automaticamente una shell. Cioè C's system()andava bene, iirc, dato che avvia una shell in ogni caso, ma .NET Process.Startdeve invocare esplicitamente la shell. Qualcosa del genere, iirc. In ogni caso, considero questa la risposta migliore di quella accettata :-)
Joey

2
Le opzioni per fornon ferire ma confondere il problema. Che dire di questo:for /f %%a in ('"echo Test"') do my_command %%a
Evan Haas

9
Usa un singolo% invece di %% quando esegui lo stesso sulla riga di comando, piuttosto che in uno script batch.
jsears

2
Non sembra funzionare bene con le tubazioni, ad esempio l'operatore ">". Ma per il resto è fantastico. A meno che questo non fosse solo un problema% vs %% che ho avuto.
Jonathan

3
@Evan: tokens=*è importante. Altrimenti, se il risultato del comando include spazi, viene emessa solo la prima parola. Eseguire questo al prompt: for /f %a in ('"echo foo bar"') do echo "%a". Verrà stampato "foo".
Dan Dascalescu

29

Leggi la documentazione per il comando "for": for /?

Purtroppo non ho effettuato l'accesso a Windows per controllarlo da solo, ma penso che qualcosa di simile possa approssimare ciò che desideri:

for /F %i in ('echo Test') do my_command %i

6
Nel caso in cui qualcun altro si imbatta in questo, quando il comando viene eseguito da un file batch (* .bat), entrambe le variabili% i devono essere il doppio segno di percentuale: %% i.
mgouin

3

Puoi sempre eseguire Bash in Windows. Lo faccio sempre con MSYS (molto più efficiente di Cygwin ).


Sfortunatamente MSYS è a malapena mantenuto ora, per ottenere un bash aggiornato è necessario installarlo separatamente
Ed Randall

1
BusyBox è ancora più piccolo (~ 432 KB). Non un Bash completo però, solo Ash. Ottieni il port non ufficiale di Windows qui: frippery.org/busybox
Martin

3

Forse sto rovinando la sintassi del for /fmetodo standard , ma quando metto un comando molto complesso che coinvolge && e | entro i backtick nel limite del for /f, provoca problemi. Una leggera modifica dal solito è possibile per gestire un comando di complessità arbitraria:

SET VV=some_command -many -arguments && another_command -requiring -the-other -command | handling_of_output | more_handling
for /f "usebackq tokens=*" %%a in (`%VV%`) do mycommand %%a

Inserendo prima il comando completo e complesso in una variabile, quindi inserendo un riferimento alla variabile nel limite anziché inserire il comando complesso direttamente nel limite del ciclo for, è possibile evitare problemi di interpretazione della sintassi. Attualmente, se copio il comando esatto che ho impostato sulla VVvariabile nell'esempio sopra in cui è utilizzato, %VV%provoca errori di sintassi.


1
Questo non ha funzionato per me, ma ho scoperto che puoi fare piping direttamente all'interno del comando for se esegui l'escape con un carato (^): for / f "usebackq tokens = *" %% a in (`command ^ | comando`)
esegui il

@Heptite Card escaping non ha funzionato per me, ma la riga di comando circostante con virgolette doppie sì.
Alexandr Zarubkin,

@Heptite Nel mio caso non conoscevo la serie di comandi che avrei dovuto eseguire in anticipo, sono stati estratti da un file in un caso e passati in un altro. Con l'escaping devi sapere quante volte sfuggire al comando in base al numero di interpreti che verrà eseguito e nei miei casi d'uso non era un numero coerente di interpreti.
mtalexan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.