Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 导致意外行为的批处理回显管道符号_Batch File - Fatal编程技术网

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