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
Windows CMD.EXE 没有内置处理特殊字符(如换行符或回车符)的功能。但有一些已知的技巧可以让您访问一些常用的字符。
回车符 (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
在上面的例子中,“ world!”由于 %A 变量中包含 CR,所以覆盖了“Good morning”的开头。
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
换行 (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!
或者可以定义另一个具有内置适当转义序列的变量,以便该变量可以直接用于正常扩展。
D:\test>set \n=^^^%LF%%LF%^%LF%%LF%
D:\test>echo Hello%\n%world!
Hello
world!
退格键 (BS) 0x08
使用$H可以设置提示符(BS)(space)(BS)
,使用FOR循环可以解析出单个BS。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