Como este comando do Windows funciona: echo% path:; = & echo.%

23

Procurando uma solução para imprimir pathes dentro da pathvariável na linha de comando do Windows, cheguei a esta solução. a resposta é este comando:

echo %path:;=&echo.%

agora eu me pergunto como isso funciona.

yekanchi
fonte

Respostas:

22

Essa é uma solução interessante que eu nunca vi antes. Deixe-me tentar explicar:

  1. Para imprimir o caminho inteiro, use echo %path%. Isso imprimirá todos os diretórios em uma única linha separada por ponto e vírgula ( ;)
  2. Para pesquisar / substituir uma string em uma variável, use o %path:a=b%que substituirá todos os acaracteres porb
  3. echo. é usado para imprimir uma nova linha
  4. &é usado para separar comandos, por exemplo echo line1&echo line2, imprimirá duas linhas
  5. Com efeito, ponto e vírgula no caminho são substituídos por um comando para imprimir uma nova linha. Ou talvez seja interpretado como 'substituir ;por nada e , em seguida , imprimir uma nova linha'. Não consigo encontrar nenhuma documentação sobre isso, então é apenas minha interpretação. Francamente, eu nem sabia que isso era possível, mas lá vai você. ATUALIZAÇÃO Minha interpretação desta etapa parece estar errada e é melhor explicada por wizzwizz4 .
Berend
fonte
Para que servem os sinais %%, não podemos dizer echo path? %% são usados ​​para variáveis?
yekanchi
11
Sim, isso está correto, esses são usados ​​para obter o valor de uma variável. Por exemplo: set greeting=Helloe então echo %greeting%. De maneira confusa, PATHpassa a ser um comando e uma variável, portanto, digitando o comando path, ou echo %path%terá o mesmo resultado.
Berend
como essa sintaxe é chamada? é regex? ou algo usado em janelas TMC somente
yekanchi
Não tenho certeza se existe um nome para isso, é exatamente como as variáveis ​​funcionam no DOS. Outros idiomas, como o bash, usam, $PATHpor exemplo.
Berend
2
Isso não tem nada a ver com o DOS, Berend; e echo.não é "o comando para imprimir uma nova linha". Este é o interpretador de comandos da Microsoft para Windows NT cmd; e o echo.é simplesmente o comando para imprimir um elemento do caminho, garantindo que, se o elemento do caminho estiver vazio, ele não mude para a outra funcionalidade deecho . O primeiro também echodeve ser um echo..
JdeBP #
30

Isso está usando a substituição de variável da linha de comando. %path:;=&echo.%significa " %path%, mas substitua todos os ;s por &echo.". Isso significa que, com set path=C:\Windows\System32;C:\Windows\;;C:\Python37;:

echo %path:;=&echo.%

torna-se:

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

Como &é um separador de comandos, isso é equivalente a:

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

Devido a peculiaridades do lote do DOS, echo.é idêntico, echo exceto quando não há nada depois. Se for esse o caso, ele simplesmente imprime nada, em vez de dizer se ECHOestá ativado ou desativado. Isso fará com que a saída:

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

C:\Python37

C:\Users\wizzwizz4> 

Realmente, deve-se echo.%path:;=&echo.%considerar o caso em que %PATH%começa com a ;, mas esse comando é bastante inteligente de qualquer maneira.


Entrando em detalhes detalhados, realmente echo( deve ser usado em vez de echo.. Isso ocorre porque echo.pode haver problemas quando você tem um arquivo chamado echoe é lento porque ele precisa verificar o disco ( %CD%e acho que todos %PATH%) toda vez que ele é executado. (Eu não tenho uma cópia do Windows, portanto não posso verificá-la; é apenas %CD%ou em qualquer lugar %PATH%que a presença do echoarquivo afetará echo.e o que ele faz?)

wizzwizz4
fonte
Esse é um comportamento de longa data dos intérpretes de comando da Microsoft / IBM em vários sistemas operacionais e não é específico para scripts em lote. Como observei em superuser.com/a/310157/38062 anos atrás, existem vários caracteres de pontuação, além do espaço em branco, que contam como caracteres de finalização do nome do comando.
JdeBP
@JdeBP Acho que um dos mais eficientes é echo), mas não me lembro. ;-(
wizzwizz4
3
echo.é o que as pessoas costumavam circular mais, anos atrás. É o único em muitos livros. Eficiência não é o problema. É um comportamento maluco quando existem vários arquivos. Quando escrevi uma substituição de 32 bits para os 16 bits cmdno OS / 2, a quebra de nomes de comandos nesses caracteres de pontuação e esse comportamento de análise altamente irregular são uma das coisas que eu não dupliquei deliberadamente e que coloquei no documento lista de diferenças. Em echodotvez disso, criei um comando externo , que poderia ser alternativo, echo.conforme desejado.
JdeBP # 23/18
@JdeBP Isso parece realmente interessante! Você acha que poderia documentar um pouco disso ?
Wizzwizz4
Se você seguir vários links de comentários, você termina com uma mensagem de fórum de terceiros que echo(é a única versão segura.
Neil