Come funziona questo comando di windows: echo% path:; = & echo.%


Risposte:


22

Questa è una soluzione interessante che non avevo mai visto prima. Vorrei provare a spiegare:

  1. Per stampare l'intero percorso, utilizzare echo %path%. Questo stamperà tutte le directory su un'unica riga separate da punti e virgola ( ;)
  2. Per cercare / sostituire una stringa in una variabile, utilizzare %path:a=b%che sostituirà tutti i acaratteri conb
  3. echo. è usato per stampare una nuova riga
  4. &viene utilizzato per separare i comandi, ad esempio echo line1&echo line2stamperà due righe
  5. In effetti, i punti e virgola nel percorso vengono sostituiti con un comando per stampare una nuova riga. O forse viene interpretato come "sostituisci ;con niente, quindi stampa una nuova riga". Non riesco a trovare alcuna documentazione su questo, quindi è solo la mia interpretazione. Francamente, non sapevo nemmeno che fosse possibile, ma il gioco è fatto. AGGIORNAMENTO La mia interpretazione di questo passaggio sembra essere off ed è meglio spiegata da wizzwizz4 .

a cosa servono i segni %%, non possiamo dirlo echo path? %% sono usati per le variabili?
yekanchi,

1
Sì, è corretto, quelli vengono utilizzati per ottenere il valore di una variabile. Ad esempio: set greeting=Helloe poi echo %greeting%. Confusamente, PATHsembra essere sia un comando che una variabile, quindi digitando il comando path, o echo %path%avrà lo stesso risultato.
Berend,

come si chiama questa sintassi? è regex? o qualcosa usato solo in Windows CMD
yekanchi il

Non sono sicuro che ci sia un nome per questo, è solo il modo in cui le variabili funzionano in DOS. Altre lingue, come bash, usano $PATHad esempio.
Berend,

2
Questo non ha nulla a che fare con DOS, Berend; e echo.non è "il comando per stampare una nuova riga". Questo è l'interprete dei comandi di Microsoft per Windows NT cmd,; e il echo.è semplicemente il comando per stampare un elemento path assicurandosi che se l'elemento path è vuoto non passi all'altra funzionalità diecho . Anche il primo echodovrebbe esserlo echo..
JdeBP,

30

Questo sta usando la sostituzione della variabile da riga di comando. %path:;=&echo.%significa " %path%, ma sostituisci tutte le ;s con &echo.". Ciò significa che, con set path=C:\Windows\System32;C:\Windows\;;C:\Python37;:

echo %path:;=&echo.%

diventa:

echo C:\Windows\System32&echo.C:\Windows\&echo.&echo.C:\Python37&echo.

Poiché &è un separatore di comandi, questo equivale a:

echo C:\Windows\System32
echo.C:\Windows\
echo.
echo.C:\Python37
echo.

A causa di stranezze di DOS Batch, echo.è identico a echo tranne quando non c'è nulla dopo. In tal caso, non stampa semplicemente nulla, invece di dirti se ECHOè acceso o spento. Questo renderà l'output:

C:\Users\wizzwizz4> echo %path:;&echo.%
C:\Windows\System32
C:\Windows\

C:\Python37

C:\Users\wizzwizz4> 

In realtà, dovrebbe essere echo.%path:;=&echo.%il caso in cui %PATH%inizia con a ;, ma questo comando è comunque abbastanza intelligente.


Entrare in dettagli dettagliati, in realtà echo( dovrebbe essere usato al posto di echo.. Questo perché echo.può avere problemi quando hai un file chiamato echoed è lento perché deve controllare il disco ( %CD%e penso anche a tutti %PATH%) ogni volta che viene eseguito. (Non ho una copia di Windows, quindi non posso controllarlo da solo; è solo %CD%o dovunque %PATH%che la presenza del echofile influenzerà echo.e cosa fa?)


Si tratta di un comportamento di lunga data degli interpreti di comandi Microsoft / IBM su diversi sistemi operativi e non è specifico per gli script batch. Come ho notato su superuser.com/a/310157/38062 anni fa, ci sono diversi caratteri di punteggiatura oltre allo spazio bianco che contano come caratteri di terminazione nome-comando.
JdeBP,

@JdeBP Penso che uno dei più efficienti sia echo), ma non ricordo davvero. ;-(
wizzwizz4

3
echo.è quello che le persone circolavano di più, anni fa. È quello in molti libri. L'efficienza non è il problema. È un comportamento strano quando si verificano vari file. Quando ho scritto una sostituzione a 32 bit per il 16 bit cmdin OS / 2, la rottura dei nomi dei comandi in questi caratteri di punteggiatura e questo comportamento di analisi altamente irregolare è una delle cose che deliberatamente non ho duplicato e che ho messo sul documentato elenco di differenze. Ho fatto invece un echodotcomando esterno , che si potrebbe alias echo.come desiderato.
JdeBP,

@JdeBP Sembra davvero interessante! Pensi di poterne documentare un po ' ?
wizzwizz4,

Se segui vari link di commento, finirai in un forum di terze parti che echo(indica solo la versione sicura.
Neil,
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.