我尝试用谷歌搜索并搜索堆栈溢出,但它没有返回任何有用的结果
^ 符号在 cmd 中有什么作用,为什么要问我更多?
更多什么?更多信息?更具体?烤鸭多吗?^
的单个条目加上按回车键
两个单独的问题more?
more?
为什么是两个?
同时输入双 ^^
返回,'^' is not recognized as an internal or external command
为什么它也只返回一克拉?
在第一种情况下,单个克拉返回 NOT NULL 或未定义值
而第二个可能是 undefined
?
很简短的问题。
我的问题可能是这个问题的重复:
What does the single circumflex do in cmd
但仍然对屏幕截图中最后一个命令的输出感到困惑。
最佳答案
插入符号的第一个( ^
)是 cmd 的转义字符,当用作一行的最后一个字符时,它会删除该行的末尾并附加下一行并转义第一个字符
第二,与流行的看法相反,您可以将多行命令写入 cmd 提示符,通常这是通过将命令括在括号中来完成的。
例如:
c:\>@(
more? echo.hello
more? echo.there
more? )
---[output]---
hello
there
另一种方法是在行尾使用插入符号。当第一行的最后一个字符是插入符时,这意味着行尾没有被处理(技术上它与插入符一起被删除),并且第二行的第一个字符将被转义。
因此,在第 2 行,如果您只是按“回车”(回车),它将被转义,然后您会得到第二个
more?
因为该行现在也将附加到第一行。但是,您只逃脱了第二个 EOL,这意味着这是一种将回车符保存到变量中的方法。但是,使用变量回显该行仅在启用延迟扩展时才有效。
因此,例如,在 CLI 中这样就可以了:
c:\>echo.this ^
more? and that
---[result]---
this and that
您也可以使用它来在 CLI 中设置变量,而不需要回车c:\>Set var=Some ^
more? Text
c:\> echo %var%
---[result]---
Some Text
如前所述,如果回显,并且 ^ 是该行的最后一个字符,并且您在第一个 more?
上按回车键您仍然可以在该行中写入更多内容并显示它,包括回车符。这可以在没有延迟扩展的情况下工作。c:\>echo.this .^
more?
more? and that
---[result]---
this .
and that
然而,虽然您可以如上所述在 CLI 上保存变量,但当您尝试 echo
时会出现以下行为。它:c:\>Set var=Some ^
more?
more? Text
c:\> echo %var%
---[result]---
Some
这是因为即使没有延迟扩展,以这种方式保存变量也可以工作,但是到 echo
通过 EOL 字符的值,您将需要延迟扩展。但是我们可以看到它使用
SET
与回车一起存储c:\>Set var=Some ^
more?
more? Text
c:\> SET var
---[result]---
var=Some
Text
所以你仍然可以用 FOR
把它弄出来循环,否则您将需要打开延迟扩展,这可以通过启动 CMD
来完成。与 /V
选项。所以这个简单
for
循环将起作用,但仅当存储在变量中的字符串中没有空格或逗号时。所以这将起作用:
c:\Set var=This_Has_no...Spaces^
More?
More? In_it
c:\>for %A IN (%var%) DO @(ECHO.%~A)
---[result]---
This_Has_no...Spaces
In_it
但这不会得到你想要的:c:\>Set var=Some more text ^
more?
more? goes here
c:\>for %A IN (%var%) DO @(ECHO.%~A)
---[result]---
Some
more
text
goes
here
但是,如前所述,SET
确实显示了回车符,因此您可以使用 FOR /F
将两行都取出来环形:c:\>Set var=Some more text ^
more?
more? goes here
c:\>for /F "Tokens=*" %A IN ('SET VAR') DO @(ECHO.%~A)
---[result]---
var=Some more text
goes here
因为现在我们还有 var=
一开始,所以我们真的不希望有那个,这意味着我们需要在变量的开头附加一个回车符并跳过第一行,得到这样的:c:\>Set var=^
More?
More? Some text here ^
More?
More? Also Here
c:\>for /F "Tokens=* SKIP=1" %A IN ('SET VAR') DO @(ECHO.%~A)
---[result]---
Some text here
Also Here
因此,完成此操作的最简单方法是启用延迟扩展并像往常一样使用 echo:c:\>Set var=Some ^
more?
more? Text
c:\>cmd /V
c:\> echo !var!
---[result]---
Some
Text
关于cmd - 为什么在cmd中输入一个^多问我一个问题?然后什么都不做,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64399161/