cmd.exe цитируемое расширение строки?

1553
Steven Penny

Bash имеет функцию расширения строк в кавычках, которая позволит вам отправлять специальные символы, например

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

В этом случае буквальный возврат каретки проходит. Вопрос в том, как бы вы отправили буквальный возврат каретки cmd.exe?

0

1 ответ на вопрос

3
dbenham

Windows CMD.EXE не имеет встроенного средства для работы со специальными символами, такими как перевод строки или возврат каретки. Но есть известные хаки, которые могут дать вам доступ к нескольким часто нужным персонажам.

CarriageReturn (CR) 0x0D

Все, что нужно, это файл - любой файл. Предпочтительно файл должен быть небольшим, чтобы команда выполнялась быстрее. Содержимое файла не имеет значения. Это может быть даже пустым!

Команда COPY / Z печатает состояние завершения в процентах без LF, которое несколько раз приводит к CR, пока не достигнет 100%. Правильно сформированный оператор FOR может анализировать CR с начала строки. Затем вы можете использовать переменную FOR в своем утверждении.

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

В вышесказанном "мир!" перезаписывает начало «Доброе утро» из-за CR, содержащегося в переменной% A.

CR может быть помещен в переменную среды, чтобы его можно было использовать позже, но CR будет сохраняться только при использовании отложенного расширения. Задержка расширения может быть включена с помощью 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

LF может быть включен в команду напрямую, используя продолжение строки и введя пустую строку для представления экранированного LF, за которым следует остаток строки.

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

LF может быть легко сохранен в переменной, где он может быть использован позже. Вы не можете просто использовать %LF%, но вы можете использовать ^%LF%%LF%для представления одного LF.

D:\test>set LF=^ More? More?  D:\test>echo Hello^%LF%%LF%world! Hello world! 

Или отложенное расширение может использоваться для удобного доступа к переменной 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! 

Или может быть определена другая переменная, для которой встроена надлежащая escape-последовательность, так что переменная может использоваться напрямую с обычным расширением.

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


BackSpace (BS) 0x08

Подсказка может быть установлена (BS)(space)(BS)с помощью $ H, и одна BS может быть проанализирована с помощью цикла FOR. Символ BS может быть сохранен в переменной окружения для последующего использования.

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 
+1 for a better solution. Marking mine for deletion. Nicole Hamilton 11 лет назад 0