为什么在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
我尝试用谷歌搜索并搜索堆栈溢出,但没有返回任何有用的结果
^ 符号在 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