批处理文件中的`@`符号导致错误

3

我有一个批处理文件,我正在尝试使其工作,但我无法抑制几个命令的输出。我尝试过的一种解决方法是使用@符号开头的命令-(我已经成功地做过很多次)。以下是代码:

@echo off
setlocal
for /f "tokens=*" %%i in (tmp\hdata.txt) do (

    ::' just a note - hdata.txt contains lines of text such as,
    ::' for example:
    ::' jquery_javascript_32
    ::' underscore_javascript_9
    ::' I couldn't do this with simple delimiters because some lines are like:
    ::' underscore_js_javascript_43

    set "id=%%i"
    set filewithnum=!id:_javascript_=!

     ::' *** BELOW throws error ***
     @echo !filewithnum!|findstr /R "[0-9]$" && set "file=!filewithnum:~,-1!" >nul 2>&1

     ::' *** BELOW throws error ***
     @echo !filewithnum!|findstr /R "[0-9]$" && set "file=!file:~,-1!" >nul 2>&1

    echo !file!

)

endlocal
exit /b    

上面注释的这些代码行会抛出错误:'@echo' is not recognized as an internal or external command, operable program or batch file.

看起来很奇怪。

你有什么想法吗?


注意:上面注释::后面额外的'是为了使stackoverflow上的语法高亮正常工作。


3
你使用了 setlocal 却没有使用 setlocal enabledelayedexpansion,因此 !var! 语法将无法工作,这是一个明显的问题。第二个问题是 :: 是一个错误的标签,而在代码块内不允许使用标签 - 应该替换为 rem - Magoo
@Magoo - 我已经在注册表中启用了 enabledelayedexpansion,所以我不需要它。关于 :: 的知识很好。我之前不知道;但在这种情况下,这不是问题,因为这些注释只添加到了 Stackoverflow 上,并没有包含在原始文件中。 - dgo
1
在括号()中的命令块内永远不要使用:label:: label-like comment - JosefZ
1个回答

3

在你解决了Magoo评论中提出的问题后,你需要禁止findstr的输出。由于脚本开始时已经关闭了命令回显模式,因此你不需要使用@

你可以这样做:

@echo !filewithnum!|findstr /R "[0-9]$" && set "file=!filewithnum:~,-1!" >nul 2>&1

所以你正在重定向 set 命令的输出!要重定向 findstr 的输出,请执行以下操作:

echo !filewithnum!|findstr /R "[0-9]$" >nul 2>&1 && set "file=!filewithnum:~,-1!"

这回答了我真正想知道的问题,非常感谢。如果你能告诉我这个:是双重@语法导致了错误吗?我会接受它作为答案。你肯定会得到点赞,但我确实想知道为什么会抛出错误。 - dgo
2
@user1167442 我认为你遇到这个特定错误的原因是由于那些未记录在案的cmd.exe奥秘之一,但如果你用rem替换::风格的注释,你的问题就会消失。::从来没有被设计成用作注释,所以如果你正在使用一个未记录的功能,任何行为都是允许的。 - Klitos Kyriacou
5
即使在命令块内部,您也可以将::用作注释,但是您需要确切地了解其行为。括号中的标签为“双行”导向。在:label之后的第二行不会将@视为特殊字符,而是尝试执行名为@echo.bat的文件。 - jeb
2
另一种方法是完全使用“批处理”:for /L %i in (0 1 9) do if "!filewithnum:~-1!" == "%i" set "file=!filewithnum:~,-1!" - Klitos Kyriacou
@KlitosKyriacou - 聪明。 - dgo

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