批处理脚本中的符号^代表什么意思?

31

在这个命令中:

FOR /F %%A IN ('TYPE "%InFile%"^|find /v /c ""')DO SET "Till=%%A"

^符号代表什么意思?


它也可以是一个转义字符,但我不确定它在这里的用法。http://www.robvanderwoude.com/escapechars.php - Mike Cheel
4个回答

29

在Windows批处理文件中,插入符号'^'有两个作用:

1. 行延续:

~~~

@echo off

dir ^
/ad ^
c:\temp

1. 在目录/ad c:\temp中查看C:\temp目录下的所有文件夹。

2. 转义保留的shell字符 & | ( < > ^.

使用前置符号"^"来转义并打印这些字符:

echo this pipe will print ^| but this one won't |
echo and this will print one caret ^^

3
1 - 行续行是一种一般转义下一个字符的特殊情况。如果跟在“^”后面的字符是换行符,则会将该换行符去掉,并将随后的字符进行转义。 - dbenham

25

在批处理脚本中,^ 符号(也称作插入符或抑扬符)是一个转义字符。当它被使用时,下一个字符会被解释为普通字符。

在你的脚本中,TYPE 命令的输出将被写入到 FIND 命令的输入中。
如果你不在 | 前使用转义字符 ^,那么 | 的常规含义就是一个 pipe character

Documentation 中写道:

如果你在使用 echo 命令时需要显示管道 (|) 或重定向 (< 或 >) 字符,请在管道或重定向字符前面立即使用插入符字符(例如,^>、^< 或 ^|)。如果你需要使用插入符字符 (^),请键入两个(^^)。


更好了,但还是有点模糊。请查看我的答案 - dbenham
@dbenham 很好的回答:+1 - Infinite Recursion

12

无限递归描述了^的一般行为,但对于为什么必须在IN ('yourCommand')中使用它有些模糊。

yourCommand实际上是隐式地在其自己的CMD.EXE进程内使用C:\Windows\system32\cmd.exe /c yourCommand执行的。显然,在您的情况下,必须包含管道符号。但在将IN()子句传递到执行之前,整个行必须由批处理解析器解析。没有^|会令批处理解析器混淆。在初始批处理解析期间,^用于转义(保护)管道符号。


感谢您的回答payeli。您能否查看一下我的批处理文件中使用了^|的代码。SET“ InFile = test.txt” SET“ OutFile = out.txt” SET“ Replace = test” SET“ ReplaceWith = sample”REM获取总行数[包括空行] FOR / F%%A在('TYPE“%InFile%”^ | find / v / c“”')DO SET“ Till =%%A”REM创建具有更改的OutFile SETLOCAL EnableDelayedExpansion <“!InFile!”( FOR / L%%a IN(1 1 0)DO SET / p“ =” FOR / L%%A IN(1 1%Till%)DO ( SET“ line =” SET / P“ line =” IF“!line!x”==“x”(Echo。 )ELSE(Echo!line:%Replace%=%ReplaceWith%!) ) )>>“%OutFile%” ENDLOCAL - user3059908
3
@user3059908 - 我几乎无法阅读你评论中的代码,也不清楚你遇到了什么问题。也许你应该创建一个新问题,附上格式正确的代码和明确陈述的问题(描述期望的行为以及出现了什么问题)。 - dbenham

1
在给定的示例中,插入符号用于转义特殊符号。虽然在Windows命令中还有其他用途。
1] 在set中,它是一个异或运算符:
set /a "_num=5^3"    &::0101 XOR 0011 = 0110 (decimal 6)

2] 在findstr中用于正则表达式,以查找行首的字符串:

Echo 12G6 |FindStr /R "[^0-9]"  &::this will check for non-numeric characters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接