Windows winXP(findstr)上以彩色回音结尾的奇怪字符串
最近我在批处理文件中发现了Windows winXP(findstr)上以彩色回音结尾的奇怪字符串,windows,batch-file,cmd,windows-xp,Windows,Batch File,Cmd,Windows Xp,最近我在批处理文件中发现了echo,在我在Windows XP上试用之前,一切看起来都很好。此错误(?)在更高版本上不可复制(至少在w7、w8上) 究竟是什么导致了在使用call:cecho”“调用字符串时显示在字符串后面?如何摆脱它并使其在winXP及更高版本上工作 @echo off setlocal ENABLEDELAYEDEXPANSION for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on &
echo
,在我在Windows XP上试用之前,一切看起来都很好。此错误(?)在更高版本上不可复制(至少在w7、w8上)
究竟是什么导致了
在使用call:cecho”“
调用字符串时显示在字符串后面?如何摆脱它并使其在winXP及更高版本上工作
@echo off
setlocal ENABLEDELAYEDEXPANSION
for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (
set "DEL=%%a"
)
call :cecho 03 "I am colorful, yay" & echo.
pause
exit
:cecho
@echo off
<nul set /p "=%DEL%" > "%~2"
findstr /v /a:%1 /R "^$" "%~2" nul
del "%~2" > nul 2>&1
编辑:
PS:我对外部程序、vbs或powershell不感兴趣。请给我纯批量溶液
编辑2:
多亏了@sokin,我找到了一个解决方案,不过@jeb的解决方案每次都会创建一个文件,但不会删除它。因此,simpledel
修复了它
@echo off
setlocal EnableDelayedExpansion
for /f "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (
set "DEL=%%a"
)
<nul > X set /p ".=."
call :color 1a "a"
call :color 1b "b"
call :color 1c "^!<>&| %%%%"*?"
del "%~dp0X"
pause
exit
:color
set "param=^%~2" !
set "param=!param:"=\"!"
findstr /p /A:%1 "." "!param!\..\X" nul
<nul set /p ".=%DEL%%DEL%%DEL%%DEL%%DEL%%DEL%%DEL%"
@echo关闭
setlocal EnableDelayedExpansion
对于/f“tokens=1,2 delims=#”%%a in(‘“prompt#$H#$E#&echo on&for%%b in(1)do rem“’)do(
设置“DEL=%%a”
)
X集/p“=”
呼叫:颜色1a“a”
呼叫:颜色1b“b”
调用:颜色1c“^!&|%%”*?”
del“%~dp0X”
暂停
出口
:颜色
设置“参数=^%~2”!
设置“参数=!参数:“=\”!"
FindSR/p/A:%1“!param!\\X“努尔
如前所述,.
在XP上,它将退格字符替换为点
但是,当创建的临时文件包含一个点而不是退格时,问题就可以解决了。
因此,我构建了第二个解决方案,但正如dbenham提到的,我的原始代码仍然无法处理某些字符
Carlos将我最初的想法改进为一个快速防弹版本,正如链接文章中提到的,
是由WinXP上的findstr
引起的,因为该工具的版本输出不可打印字符的
(同样适用于用于删除前面字符的退格;例如,在Vista上,findstr
really deletes);因此,所使用的方法在WinXP上根本不起作用。不幸的是…我不知道纯批处理中是否还有其他可靠的方法…@gordon,因为它是内置在Windows中的,也许我不必向用户提供额外的文件?@KeyWeeUsr仅供参考,我刚刚从你帖子的链接中尝试了jeb的答案,在XP中效果很好。(编辑部分中的那个)@sokin Oops,我错过了它。谢谢,现在它可以工作了。@KeyWeeUsr:使用批处理文件的另一个恼人的事情是,人们坚持认为你应该换成其他编程语言,仅仅因为他们不喜欢它!;-)
@echo off
setlocal EnableDelayedExpansion
for /f "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (
set "DEL=%%a"
)
<nul > X set /p ".=."
call :color 1a "a"
call :color 1b "b"
call :color 1c "^!<>&| %%%%"*?"
del "%~dp0X"
pause
exit
:color
set "param=^%~2" !
set "param=!param:"=\"!"
findstr /p /A:%1 "." "!param!\..\X" nul
<nul set /p ".=%DEL%%DEL%%DEL%%DEL%%DEL%%DEL%%DEL%"