sw.*_*r97 2 if-statement batch-file special-characters
相关代码如下所示:
cd /d %~dp0
if exist filename.txt (
echo %date% %time% *** text... >> filename2.txt
echo ==============================
echo === text....... ===
echo === text....... ===
echo === text....... (text...) ===
echo === text (text...
echo === text...).
:loop
set /p "varx= text: "
if "%varx%" neq "xxxx" goto loop
... more script...
)
Run Code Online (Sandbox Code Playgroud)
到处寻找解决方案......
在这里指向 If 语句分组的方向: https: //www.petri.com/forums/forum/windows-scripting/general-scripting/57625-if-exists-file-was-unexpected-at-this-time -不可以
指出了 If 块中循环问题的方向,这里: (Windows 批处理)Goto inside if 块的行为非常奇怪 - 不去
被指出使用@setlocalenabledelayedexpansion或@setlocalenableextensions的方向(无法追踪到哪里) - 不行
尝试通过 set /p varfile="filename" 传递文件名,如果存在 %varfile% - 不行
当然认为代码的其他部分导致了错误——不行
问题是,这已经工作了很长一段时间......然后我改变了我认为是一些无害的东西,无法弄清楚问题出在哪里......
这么一个晦涩难懂的问题需要解决..呃!
嗯...我将其发布为问答...因为我解决了自己的问题(我花了几天的尝试和错误来缩小范围并解决问题)。我希望这也能帮助一些可怜的灵魂,让他们免去很多心痛和几根头发……
最让我思考的是关于If 语句内循环处理不当的第二个要点……但这不是真正的原因,而是类似的原因……
事实证明,问题出在 ECHO 行上使用“('和/或')' ......
我认为这无害...我在很多地方都在 ECHO 行中使用了括号,这些行距离生成错误消息的位置大约有 10-15 行,所以我自然不认为这是来源。
但事实证明,即使在 ECHO 行上,如果在If 语句块中使用“(”或“)”,解释器显然也不喜欢使用它们。在这种情况下,它仍然必须将它们视为特殊字符......它显然不会忽略它们......
解决方案:
要么从上面 3 行中取出“(”和“)”,要么简单地 REM 这些行解决了问题,错误消息消失了……一切终于好了……
顺便说一句,类似的事情也可能适用于 FOR 语句(我隐约记得读过一些关于 FOR 行为也很奇怪的内容)。
因此值得深思。