cmd.exe citou a expansão de string?

0

O Bash tem o recurso de expansão de strings entre aspas , que permitirá que você envie caracteres especiais como assim

#!/bin/sh
rtmpdump \
  -r rtmp://freeview.fms.visionip.tv/live \
  -y tvnetwork-hellenictv-sigma-hsslive-25f-4x3-SDh$'\r' \
  -o out.flv

Nesse caso, um retorno de carro literal sendo passado. A questão é: como você enviaria um retorno de carro literal com cmd.exe ?

    
por Steven Penny 17.09.2012 / 02:17

1 resposta

3

O Windows CMD.EXE não possui um recurso interno para trabalhar com caracteres especiais, como avanço de linha ou retorno de carro. Mas existem hacks conhecidos que podem lhe dar acesso a alguns caracteres frequentemente necessários.

CarriageReturn (CR) 0x0D

Tudo o que é necessário é um arquivo - qualquer arquivo. De preferência, o arquivo deve ser pequeno para que o comando seja executado mais rapidamente. O conteúdo do arquivo não importa. Pode até estar vazio!

O comando COPY / Z imprime um status de porcentagem de conclusão sem LF que leva com um CR repetidamente até atingir 100%. Uma instrução FOR formada adequadamente pode analisar o CR desde o início da linha. Você pode então usar a variável FOR em sua declaração.

D:\test>for /f "delims=1 " %A in ('copy /z test.txt nul') do @echo Good morning %A world!
 world!rning

Acima, "mundo!" sobre-escreve o início de "Bom dia" por causa do CR contido na variável% A.

O CR pode ser colocado em uma variável de ambiente para que possa ser usado mais tarde, mas o CR só será preservado se a expansão atrasada for usada. A expansão atrasada pode ser ativada usando cmd /v:on .

D:\test>cmd /v:on
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

D:\test>for /f "delims=1 " %A in ('copy /z test.txt nul') do set "CR=%A"

" \test>set "CR=

D:\test>echo Good morning !CR! world!
 world!rning

D:\test>echo Good morning %CR% world! does not preserve the CR
Good morning  world! does not preserve the CR


LineFeed (LF) 0x0A

Um LF pode ser incorporado em um comando diretamente usando continuação de linha e inserindo uma linha em branco para representar o LF com escape, seguido pelo restante da linha.

D:\test>echo hello^
More?
More? world!
hello
world!

O LF pode ser facilmente armazenado em uma variável onde possa ser usado mais tarde. Você não pode simplesmente usar %LF% , mas você pode usar ^%LF%%LF% para representar uma única LF.

D:\test>set LF=^
More?
More?

D:\test>echo Hello^%LF%%LF%world!
Hello
world!

Ou a expansão atrasada pode ser usada para acessar convenientemente a variável LF

D:\test>cmd /v:on
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

D:\test>echo Hello!LF!world!
Hello
world!

Ou pode ser definida outra variável que tenha a sequência de escape adequada incorporada para que a variável possa ser usada diretamente com a expansão normal.

D:\test>set \n=^^^%LF%%LF%^%LF%%LF%

D:\test>echo Hello%\n%world!
Hello
world!


BackSpace (BS) 0x08

O prompt pode ser configurado para (BS)(space)(BS) usando $ H, e um único BS pode ser analisado usando um loop FOR. O caractere BS pode ser armazenado em uma variável de ambiente a ser usada posteriormente.

D:\test>for /f %A in ('prompt $h^&for %a in (1^) do rem') do @set "BS=%A"

D:\test>echo ab_%BS%cd
abcd
    
por 20.09.2012 / 01:44