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?

1 ответ1

3

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

В сказанном "мир!"msgstr "перезаписывает начало" Доброе утро "из-за 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .