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

标签 cmd windows-10 command special-characters

我尝试用谷歌搜索并搜索堆栈溢出,但它没有返回任何有用的结果
^ 符号在 cmd 中有什么作用,为什么要问我更多?
更多什么?更多信息?更具体?烤鸭多吗?^ 的单个条目加上按回车键
两个单独的问题more?more?为什么是两个?
同时输入双 ^^返回,'^' is not recognized as an internal or external command为什么它也只返回一克拉?
在第一种情况下,单个克拉返回 NOT NULL 或未定义值
而第二个可能是 undefined ?
很简短的问题。
enter image description here
我的问题可能是这个问题的重复:
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/

相关文章:

c# - 歌曲播放完了吗? (C# MCI)

powershell - 删除项目不会删除文件夹

java - 将 Ctrl+C 发送到在 java 中启动的进程

c# - 在 Windows 10 通用应用程序平台上运行 CMD 命令

windows - 如何从启动中删除 Docker.Service

windows - Windows 8 可以构建 Windows 10 IoT Core 应用程序吗?

c++ - std::system() 无法正常工作

windows - 在 Windows 中将多个文件的前缀重命名或删除为每个文件的编号

batch-file - 如何从 Windows 命令提示符以特定用户身份调用 PowerShell 脚本?

module - "command"或 Ansible 中特定模块执行之间的差异