在调用函数时使用特殊字符会出现“FINDSTR:” 错误(批处理)。

4
我正在制作一款游戏,希望能够为不同角色说的对话着色。如果我在用于给文本上色的调用函数中使用“?”(会出现FINDSTR错误),则一切正常。但是,如果我使用感叹号,则没有问题。有什么建议可以修复这个问题吗?
为了防止这种情况,我已经包含了颜色文本的代码。 编辑:此部分应放置在批处理文件的最顶部。
 for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do     rem"') do (
 set "DEL=%%a"
)

这部分内容放在批处理文件的底部。
:colorEcho
echo off
<nul set /p ".=%DEL%" > "%~2"
findstr /v /a:%1 /R "^$" "%~2" nul
del "%~2" > nul 2>&1i  

这是出现的错误:

The filename, directory name, or volume label syntax is incorrect.
FINDSTR: Cannot open  'When did it get so dark outside?' It was morning a few minutes ago...

代码最后一行的 i 是打错字了,对吧?请提供一个调用给定例程的示例命令行,并告诉我们 %DEL% 的设置是什么。 - aschipfl
怀疑 i 是一个打字错误。这是我调用例程的方式:call :colorEcho [color] "Text" %DEL% 被设置为 %%a - FudgeMuffins
“i”确实是一个打字错误,但显然它并没有造成任何影响;请在您的问题帖子中包含“call”命令行... - aschipfl
2个回答

1

好的,我进行了一些调查,并找到了一个解决方法。可以使用特殊字符,例如?*:\/"<>|

将以下内容放在批处理文件的顶部:

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

rem Prepare a file "X" with only one dot
<nul > X set /p ".=."

把这个放在批处理文件的最底部:

:colorEcho
set "param=^%~2" !
set "param=!param:"=\"!"
findstr /p /A:%1 "." "!param!\..\X" nul
<nul set /p ".=%DEL%%DEL%%DEL%%DEL%%DEL%%DEL%%DEL%"
exit /b

Use this format to color the text:
call :colorEcho [color] "Text"
E.g. call :colorEcho C "Red"
This uses the rule for valid path/filenames. If a \..\ is in the path the prefixed element will be removed completely and it's not necessary that this element contains only valid filename characters.
EDIT: Not able to use !. Will investigate further.

0

?是匹配单个字符的通配符(类似于*,它是匹配字符序列的通配符)。这些字符在文件名中不允许使用。

错误消息的第一行来自重定向> "%~2",因为您不能在重定向目标中使用通配符,您需要在那里指定一个专用文件。

错误消息的第二行确实来自findstr,它期望搜索字符串后的命令行参数是指向现有文件或文件的路径。由于前面所述的重定向失败,因此未创建任何文件。

由于findstr以彩色打印文件名,因此很明显您只能使用文件名中允许的字符。因此,以下字符被禁止使用:?*:\/"<>|

顺便说一下,在最后一个命令行del "%~2" > nul 2>&1i中的i应该被删除。


我该如何解决这个问题? - FudgeMuffins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接