【问题标题】:". was unexpected at this time" generated from batch script line 'if exist [file] (...从批处理脚本行“如果存在 [文件] (...
【发布时间】:2018-04-27 01:45:15
【问题描述】:

相关代码如下:

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...

)

已经搜索了高和低的解决方案......

问题是这个 WAS 工作了很长时间......然后我改变了我认为是一些无害的东西并且无法弄清楚问题出在哪里......

这样一个难以解决的问题......哎呀!

【问题讨论】:

    标签: batch-file if-statement special-characters


    【解决方案1】:

    好吧...我将其发布为问答...因为我解决了自己的问题(花了我几天的时间反复试验来缩小和解决问题)。我希望这也能帮助一些可怜的灵魂,为他们省去很多心痛和几缕头发......

    让我思考最多的事情是关于 If 语句中的循环处理不当...但那不是真正的原因而是类似的第二个项目符号...

    问题出在在 ECHO 行上使用“(' 和/或 ')'...

    我认为这是无害的...我在很多地方都在 ECHO 行中使用括号,这些行距生成错误消息的位置大约 10-15 行,所以我自然不认为这是在所有来源。

    但事实证明,如果在 If 语句块中使用 '(' 或 ')',即使在 ECHO 行中,解释器也不喜欢使用 >。在这种情况下,它仍然必须将它们视为特殊字符...它显然不会忽略它们...

    解决方案:

    从上面的 3 行中取出 '(' 和 ')' 或者简单地将这些行移出解决了问题并且错误消息消失了......终于一切都好了......

    顺便说一句,类似的事情也可能适用于 FOR 语句(我隐约记得读过一些关于 FOR 行为奇怪的东西)。

    所以值得深思。

    【讨论】:

      【解决方案2】:

      if exist ... ( 到右括号的整个 复合语句是code block

      code block 内,不允许使用标签,未转义的) 将终止该块,并且任何%var% 都将替换为该变量的值遇到块时

      您需要call :loop 例程(最简单的方法)

      if exist filename.txt (
          echo %date% %time% *** text... >> filename2.txt
          echo ==============================
          echo ===  text.......           ===
          echo ===  text.......           ===
          echo ===  text....... (text...^) ===
          echo ===  text (text... 
          echo ===  text...^).
          call :loop
      
       ... more script...
      
      )
      

      ...等

      转到:eof

      :循环 设置 /p "varx= 文本:" if "%varx%" neq "xxxx" 跳转循环

      转到:eof

      注意goto :eof定义为“转到文件末尾”(冒号是必需的

      注意call 在标签前有一个冒号 - 这表明它是一个内部例程 - 它位于 this 批处理文件中

      请注意,每个) 现在都被^ 转义,这使得) 成为普通字符,而不是语句终止符。

      您可能已经删除了重定向器 - called 过程中的任何 echo 都将被收集到重定向的输出中 - 如果您有的话

      (
      whatever...
      )>filename
      

      然后code block 中的任何数据echoed 将被重定向到文件 - 包括 echoes 在called 过程中。例如,您可以使用 echo to console>con 在此类块或过程中显式重定向 echo

      将任何行序列括在括号中,使其成为 code block 允许重定向块中的 echoed 输出,因此

      (
       echo this
       echo that
      )>filename
      

      创建一个新的filename,其中包含echoes 的总和,而不必将>>filename 附加到每一行。显然,>> 代替 > 将以通常的方式追加到任何现有文件。

      【讨论】:

      • 哇......这是一个快速的回复......感谢分享关于为什么会发生这种情况的见解......希望我早点发布,但直到我知道问题出在哪里找到了罪魁祸首......你能进一步解释一下你的最后一行吗?
      • @user5764 如果您认为此答案或任何其他答案是您问题的解决方案,请考虑通过选择问题左侧的灰色勾号将其选为“已接受的答案” .
      • 嗯 - 没有遇到 ( 的问题,但我承认我经常使用爱尔兰成语逃避 ()
      猜你喜欢
      • 2011-06-15
      • 1970-01-01
      • 1970-01-01
      • 2013-10-20
      • 1970-01-01
      • 2012-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多