Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.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
Windows winXP(findstr)上以彩色回音结尾的奇怪字符串_Windows_Batch File_Cmd_Windows Xp - Fatal编程技术网

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的解决方案每次都会创建一个文件,但不会删除它。因此,simple
del
修复了它

@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%"