Batch file 导致意外行为的批处理回显管道符号
我的批处理文件中有一个变量,它包含管道符号(这一个:|),因此当我回显该变量时,会收到一个关于无法识别的内部/外部命令的错误Batch file 导致意外行为的批处理回显管道符号,batch-file,Batch File,我的批处理文件中有一个变量,它包含管道符号(这一个:|),因此当我回显该变量时,会收到一个关于无法识别的内部/外部命令的错误 我需要一种方法,让它正确地回显它,或者更好地删除后面的所有内容,包括|符号以及之前的任何额外空格。问题没有指定操作系统。对于unix: 逃避它 echo \| 或者用引号括起来 echo "|" 在Windows批处理文件中使用时,通常必须转义几个特殊字符。下面是一个部分列表:&^% 转义字符是^。因此,要获得文本|,您应该执行以下操作: echo
我需要一种方法,让它正确地回显它,或者更好地删除后面的所有内容,包括|符号以及之前的任何额外空格。问题没有指定操作系统。对于unix: 逃避它
echo \|
或者用引号括起来
echo "|"
在Windows批处理文件中使用时,通常必须转义几个特殊字符。下面是一个部分列表:
&^%
转义字符是^
。因此,要获得文本|
,您应该执行以下操作:
echo ^|
当特殊字符位于变量中时,它会变得更难一些。但如果使用特殊语法,可以替换变量中的字符,如下所示:
set X=A^|B
REM replace pipe character with underscore
set Y=%X:|=_%
echo %Y%
REM prints "A_B"
在打印变量之前,必须转义|字符。下面打印a | b
@echo off
set x=a^|b
echo %x:|=^|%
REM和你应该有无限的管道。按CTRL+C组合键两次按CTRL-Break键
REM打印“进程试图写入一个不存在的管道。”如果您只是想将变量的内容回显到屏幕上,则效果很好,但如果您想将包含管道符号的值导入另一个程序(如我所做的),则需要添加更多的插入符号(^
):
回显包含管道的裸文本(|
):
设置并回显包含管道的变量(|
):
将包含管道(|
)的裸文本回显到另一个程序中:
产生:
000000 48 65 6c 6c 6f 20 7c 20 - 77 6f 72 6c 64 20 0a Hello | world .
000000 48 65 6c 6c 6f 20 7c 20 - 77 6f 72 6c 64 20 0a Hello | world .
将包含管道(|
)的变量设置并回显到另一个程序中:
产生:
000000 48 65 6c 6c 6f 20 7c 20 - 77 6f 72 6c 64 20 0a Hello | world .
000000 48 65 6c 6c 6f 20 7c 20 - 77 6f 72 6c 64 20 0a Hello | world .
(hextump
只是一个实用程序,我必须以十六进制和ASCII格式转储stdin
)
之所以需要三个插入符号(^^
),是因为CMD基本上会对命令行进行两次解析:一次是为了识别它包含一个未转义的管道(hextump位);然后,每个部分在执行它们的过程中进行第二次处理
第一个过程将
echo Hello^^^^ world
转换为echo^ world
(将中间位读为^^
,后面是^ ^
:一个转义插入符号和一个转义管道)。第二次处理时,即在执行管道时,“幸存”插入符号保护管道符号,以便将Hello | world
输入下一个命令。旧问题,但有一个未提及的解决方案,更易于使用:延迟扩展 使用延迟扩展的优点是,任何内容都可以不经修改地使用,根本不存在任何问题字符
set "test=A|B&C,D"E^<F^>G"
setlocal EnableDelayedExpansion
echo !test!
set test --- Works, but shows also: "test=..."
echo %test% --- This one fails
set“test=A | B&C,D“E^G”
setlocal EnableDelayedExpansion
回声!测试!
set test--工作,但也显示:“test=…”
echo%test%---此测试失败
我无法转义它,因为变量来自另一个命令,但引号起作用了…为什么我以前没有想到…现在看看我是否可以删除所有不需要的数据…但是,在它周围加引号会导致引号被输出。当我写这篇文章时,我实际上在考虑unix,所以它非常失败!如果你正在处理g对于来自用户/用户系统的文件系统路径,要正确地转义到没有特殊字符的内容几乎是不可能的。(文件名可以包含%、!、^等)需要注意的是,执行^%不起作用,对于%es,您需要使用另一个%(即使用%%)来转义。非常感谢-这是唯一的“真正的”“问题的解决方案”输出变量(可能)包含管道”-事实上,“安全”脚本应该总是这样做…您的示例对我来说仍然没有多大意义,但延迟扩展是我想要的答案。非常感谢。
set txt=Hello ^| world
echo %txt:|=^^^|% | hexdump
000000 48 65 6c 6c 6f 20 7c 20 - 77 6f 72 6c 64 20 0a Hello | world .
set "test=A|B&C,D"E^<F^>G"
setlocal EnableDelayedExpansion
echo !test!
set test --- Works, but shows also: "test=..."
echo %test% --- This one fails