cmd.exe 引用字符串扩展?

cmd.exe 引用字符串扩展?

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

相关内容