为什么在cmd中输入一个^会多问我一个问题?然后什么都不做

Why does entering a single ^ in cmd ask me a question more? then not do anything

我尝试用谷歌搜索并搜索堆栈溢出,但没有返回任何有用的结果
^ 符号在 cmd 中有什么作用,为什么它会问我更多?
更多什么?更多信息?更具体?更多烤鸭?

单次输入 ^ 加上按输入键返回

的两个单独的行问题 more?
more?

为什么是两个?
输入双 ^^ returns,
'^' is not recognized as an internal or external command
为什么它也只返回一克拉?

在第一种情况下,单克拉 returns 非空值或未定义值
而第二个可能是 undefined?

很短的问题。

我的问题可能与这个问题重复:

但仍然对屏幕截图中最后一条命令的输出感到困惑。

第一个脱字符号 (^) 是 cmd 的转义字符,当用作一行的最后一个字符时,它会删除行尾并附加下一行并转义第一个字符

2 与流行的看法相反,您可以将 multi-line 命令写入 cmd 提示符,通常这是通过将命令括在括号中来完成的。 例如:

c:\>@(
more? echo.hello
more? echo.there
more? )

---[output]---
hello
there

另一种方法是在行尾使用插入符号。

当第一行的最后一个字符是插入符号时,这意味着不处理行尾(技术上它与插入符号一起删除),第二行的第一个字符将被转义。

因此,在第 2 行,如果您只是按“回车”(回车 return),它将被转义,然后您会得到第 2 个 more?,因为该行现在 also.be附加到第一个。

但是你只逃脱了第二个 EOL,这意味着这是一种将回车 return 保存到变量中的方法。但是,仅当启用延迟扩展时,使用变量回显该行才有效。

因此,例如,在 CLI 中这样就可以了:

c:\>echo.this ^
more? and that

---[result]---
this and that

您也可以使用它在 CLI 中设置变量,而不需要回车 return 问题

c:\>Set var=Some ^
more? Text
c:\> echo %var%

---[result]---
Some Text

如前所述,如果回显,并且 ^ 是该行的最后一个字符,您在第一个字符上按回车键 more? 您仍然可以向该行写入更多内容并让它显示出来,包括回车return。这在没有延迟扩展的情况下有效。

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 字符的值你需要延迟扩展。

但是我们可以看到它是用 return 使用 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 确实显示了回车符 return,因此您可以使用 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= 所以我们真的不希望有那个,这意味着我们需要在变量的开头有一个额外的回车 return 并跳过第一行,这样得到它:

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