设置/P提示符中的Dos/Windows批处理插入符号转义
我只是好奇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
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 ^^^" !