String 控制字符和字符串操作
使用发布的技巧将backspace控件字符保存到变量中-当“重叠”backspace时,我会得到奇怪的结果 这个例子是在一个代码高尔夫挑战贴在这里:(将感谢任何提示,使这个代码更短) 无嗅的它可能看起来像这样:String 控制字符和字符串操作,string,batch-file,String,Batch File,使用发布的技巧将backspace控件字符保存到变量中-当“重叠”backspace时,我会得到奇怪的结果 这个例子是在一个代码高尔夫挑战贴在这里:(将感谢任何提示,使这个代码更短) 无嗅的它可能看起来像这样: @echo off setLocal enableDelayedExpansion for /F %%a in ('"prompt $H&echo on&for %%b in (1) do rem"') do set DEL=%%a set s=%1 echo %s:
@echo off
setLocal enableDelayedExpansion
for /F %%a in ('"prompt $H&echo on&for %%b in (1) do rem"') do set DEL=%%a
set s=%1
echo %s:^H=!DEL!%
基本上,它使用Jeb的技巧将backspace保存为变量,然后使用字符串操作将输入字符串中的所有^H
实例替换为该变量。对于以下示例和类似输入,其工作正常:
C:\>bsp.bat "testing^H^H^H test"
"test test"
但是,当出现^H
的“重叠”用法时,我(对我)会得到以下令人困惑的结果:
我的问题是-在上面的示例中,为什么我收到的是这个输出而不是预期的“A”
?预期的“A”B
结果是预期的,因为退格字符(0x08)
只会将光标向后移动而不会擦除字符
当您使用提示符$H时,它实际上会打印
。第一个
向后移动一个,空格覆盖(视觉上清除)字符,然后第二个
再次移回您想要的位置
带有FOR/F的默认分隔符是
,因此您的赋值只保留第一个
。将delimter更改为“r”,即可获得所需的结果:
@echo off
setLocal enableDelayedExpansion
for /F "delims=r" %%a in ('"prompt $H&echo on&for %%b in (1) do rem"') do set DEL=%%a
set s=%1
echo %s:^H=!DEL!%
或者,保留单个
定义并自己显式覆盖字符:
@echo off
setLocal enableDelayedExpansion
for /F %%a in ('"prompt $H&echo on&for %%b in (1) do rem"') do set DEL=%%a
set s=%1
echo %s:^H=!DEL! !DEL!%
我不明白为什么“预期产出”应该是“A”。请参阅此逐字符输出:
bsp.bat "AAA^HB^H^H"
"
"A
"AA
"AAA
"AAA <- backspace, the cursor is over last "A"
"AAB
"AAB <- backspace, the cursor is over last "B"
"AAB <- backspace, the cursor is over second "A"
"A"B
我必须问你为什么要这样做?您正在使用一种十多年没有更新过的语言来处理未记录的遗留控制台行为,然后来到这里询问您发现的一些奇怪行为。答案几乎肯定已经被历史遗忘了。@RyanBemrose我为什么要这么做——我是黑客解决方案的忠实粉丝,尤其是对于代码高尔夫,尤其是批量游戏。“迷失于历史”——我们会看到,我真的很怀疑我的问题的答案是否那么模糊。我只是对CMD对控制字符或字符串操作的处理理解不够。谢谢你的解释。我的错误。正如我所说的,这是一个不理解控制字符本身的问题——或者退格回音的概念。我已将字符串操作更改为
%s:^H=!DD!%代码>。回答得好。为了节省一些字节用于代码高尔夫挑战,我使用了相同的退格字符捕获,并将字符串操作更改为%s:^H=!DD!%代码>。谢谢。我正在进行与您的评论相同的基本编辑:-)
bsp.bat "AAA^HB^H^H"
"
"A
"AA
"AAA
"AAA <- backspace, the cursor is over last "A"
"AAB
"AAB <- backspace, the cursor is over last "B"
"AAB <- backspace, the cursor is over second "A"
"A"B
for /F %%a in ('echo prompt $H ^| cmd') do set BS=%%a