Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
设置/P提示符中的Dos/Windows批处理插入符号转义_Windows_Batch File_Escaping_Character_Caret - Fatal编程技术网

设置/P提示符中的Dos/Windows批处理插入符号转义

设置/P提示符中的Dos/Windows批处理插入符号转义,windows,batch-file,escaping,character,caret,Windows,Batch File,Escaping,Character,Caret,我只是好奇Windows批处理中插入符号逃逸的一个具体案例: 请将以下代码保存为文件ttt.bat,并在命令提示下运行ttt.bat,为什么我必须重复5次插入符号(或克拉?)字符^才能使此技巧起作用?我只想在回显字符串中放置一个管道“|” 有一些关于Windows批处理转义的文档,但是出于案例研究的目的,您能解释一下本例中使用的每个插入符号的含义吗?谢谢 @echo off SetLocal EnableDelayedExpansion set foo=Hello world set bar

我只是好奇Windows批处理中插入符号逃逸的一个具体案例:

请将以下代码保存为文件
ttt.bat
,并在命令提示下运行
ttt.bat
,为什么我必须重复5次插入符号(或克拉?)字符
^
才能使此技巧起作用?我只想在回显字符串中放置一个管道
“|”

有一些关于Windows批处理转义的文档,但是出于案例研究的目的,您能解释一下本例中使用的每个插入符号的含义吗?谢谢

@echo off

SetLocal EnableDelayedExpansion

set foo=Hello world
set bar=Why why

echo|set /P=!foo! ^^^^^| !bar!

EndLocal
很明显:-)

这里涉及到一些问题

第一个重要的阶段是特殊字符阶段,插入符号转义下一个字符,对
^ |&
字符很重要

线路将从

echo|set /P=!foo! ^^^^^| !bar!  

一个插入符号从下一个插入符号中逸出,最后一个插入符号从管道中逸出

这里的下一个重要阶段是延迟扩展阶段,只有在至少有一个
的情况下才会出现此阶段在行中。
在这个阶段,插入符号也会转义下一个字符,但这里只需要插入符号本身和
,在此阶段,延迟变量将展开

当您在此处使用管道时,管道的两侧将被传输到一个新的cmd.exe进程,并在那里再次解析命令

cmd.exe/c“echo”
cmd/c“set/p=Hello world^|为什么

只有
set/p=Hello world^ | Why-Why
现在才相关。
同样在特殊字符阶段,一个插入符号将管道字符转义为

set /P=Hello world | Why why
延迟扩展阶段将不会生效,首先是因为延迟扩展在新cmd.exe中被禁用(默认),其次是因为行中没有任何

就这些

顺便说一句,
这里不需要生成两个进程,重定向更简单、更快

<nul set /P=!foo! ^^^| !bar!
很明显:-)

这里涉及到一些问题

第一个重要的阶段是特殊字符阶段,插入符号转义下一个字符,对
^ |&
字符很重要

线路将从

echo|set /P=!foo! ^^^^^| !bar!  

一个插入符号从下一个插入符号中逸出,最后一个插入符号从管道中逸出

这里的下一个重要阶段是延迟扩展阶段,此阶段仅在至少有一个
在行时出现。
在这个阶段,插入符号也会转义下一个字符,但这里只需要插入符号本身和
,在这个阶段,延迟变量会展开

当您在此处使用管道时,管道的两侧将被传输到一个新的cmd.exe进程,并在那里再次解析命令

cmd.exe/c“echo”
cmd/c“set/p=Hello world^|为什么

只有
set/p=Hello world^ | Why-Why
现在才相关。
同样在特殊字符阶段,一个插入符号将管道字符转义为

set /P=Hello world | Why why
延迟扩展阶段将不会停止,首先是因为延迟扩展在新cmd.exe中被禁用(默认),其次是因为没有任何
在行中。
就这些

顺便说一句,
这里不需要生成两个进程,重定向更简单、更快

<nul set /P=!foo! ^^^| !bar!

我做对了吗:在延迟扩展解析阶段,只有在至少一个
的情况下,
^
才会转义到
^
出现在已解析的命令行中,因此当没有此类字符时,
^
保持原样?我是否正确:在延迟扩展解析阶段,只有在至少一个
的情况下,
^
才会转义到
^
出现在已解析的命令行中,因此当没有此类字符时,
^
保持原样?如果您编写
echo | set/P“=!foo!|!bar!”
,则根本不需要将管道字符转义为双引号字符串的一部分
set/P“variable=prompt text”
分别
set“variable=string value”
是将字符串分配给环境变量的首选方法。请在命令提示窗口中查看并执行
cmd/?
,并至少阅读最后一个输出帮助页面上的最后一段。我想shell也会打印双引号,谢谢您指出这一点!好的,如果您要编写
echo | set/P“=!foo!|!bar!”
,那么您根本不需要将管道字符作为双引号字符串的一部分进行转义
set/P“variable=prompt text”
分别
set“variable=string value”
是将字符串分配给环境变量的首选方法。请在命令提示窗口中查看并执行
cmd/?
,并至少阅读最后一个输出帮助页面上的最后一段。我想shell也会打印双引号,谢谢您指出这一点!
<nul set /P=FOO ^| BAR
echo "carets ^^^"
echo "carets ^^^" !