【问题标题】:CMD - If exists <file>CMD - 如果存在 <文件>
【发布时间】:2013-02-05 08:10:36
【问题描述】:

根据我的理解,以下命令(添加了调试行 - 缩进)应该只将 echo 的输出重定向到一个文件,如果它已经存在的话。

但是,if exist %test0% 似乎 总是 用 echo 的输出填充文件(如果不存在,则创建它)。

有谁知道怎么回事?

@echo off
type test.bat
set test0="e:\documents and settings\administrator\desktop\test.log"
   echo.&echo.
   if exist %test0% (echo !!Exists!!) else (echo !!Doesn't Exist!!)
(if exist %test0% echo.&echo.&echo -------------------------------------------------&echo.&echo.)>>%test0%

然后文件被创建(!)




编辑: 以上是一个简化的示例,不幸的是,MSalters 的答案并不能帮助我解决完整的命令(我曾希望它会)。完整的一行 if 语句是:
if exist %test0% (echo.&amp;echo.&amp;echo -------------------------------------------------&amp;echo.&amp;echo.) else (set /p .=&lt;nul)&gt;&gt;%test0%&amp;set errorlevel=0||set errorlevel=1

我将如何将if 的任何条件匹配输出到文件(希望只有一个对文件的引用,即每个if 条件中没有一个),并根据errorlevel 设置文件的existance?

任何人都可以帮助解决实际的完整命令问题吗?

【问题讨论】:

    标签: redirect if-statement cmd exists


    【解决方案1】:

    您应该切勿直接设置 ERRORLEVEL。该名称保留用于报告先前命令的结果。当您直接设置该值时,您会覆盖预期的功能并且它不再扩展为实际的 ERRORLEVEL,而是扩展为您设置的值。这可以破坏各种代码。

    您可以通过运行具有已知结果的命令强制 ERRORLEVEL 为一个值,如有必要,将输出重定向到 nul:ver &gt;nul 将 ERRORLEVEL 设置为 0,set /p .=&lt;nul 将 ERRORLEVEL 设置为 1。

    您可以使用cmd /c exit /b N 将ERRORLEVEL 强制设置为您选择的任何特定值,其中N 是一个整数值。

    你也有错误的逻辑。无论条件评估为 TRUE 还是 FALSE,您的 IF 命令都会成功(没有错误)。如果要设置 ERRORLEVEL,则需要在括号内的块中进行。

    将所有内容放在一行中并没有错,但是我发现在像您这样的复杂语句中使用多行时,代码更易于阅读。我相信您正在寻找以下内容。

    if exist %test0% (
      echo.
      echo.
      echo -------------------------------------------------
      echo.
      echo.
      ver >nul
    ) >>%test0% else (
      set /p .=<nul
    )
    

    编辑以响应 cmets

    不需要太多改变。

    if exist %test0% (
      (
        echo.
        echo.
        echo -------------------------------------------------
        echo.
        echo.
        set ERR=0
      ) >>%test0%
    ) else (
      copy nul %test0%
      set ERR=1
    )
    

    【讨论】:

    • 我意识到这是我第三次移动球门柱,可以这么说,但errorlevel 不是实际的变量名称(认为这可能是个坏主意,但更容易阅读比真正的 var 名称 - 感谢您的提醒)。至于set /p .=&lt;nul,这很有趣,并解释了一些我无法理解的逻辑,但实际上我只是使用它来创建文件,如果它不存在的话,而不是用任何东西填充它。最后,我认为存在误解,因此我将发表另一条评论,概述我的目标。
    • 1) 如果文件不存在,则创建一个没有任何内容的文件;或者用双空行+破折号行+双空行填充它(最好只有一个&gt;&gt;file指令,而不是每个if条件中的一个)。 2)根据重定向成功与否设置变量或%errorlevel%
    • 谢谢,所以第一个似乎满足两个条件;第二个总是用空行+破折号创建(或修改)文件,但永远不会只创建一个空文件,即使在运行之前不存在。但是,我很好奇,就第二个示例而言,有没有办法将真假条件输出到文件中,它必须只是其中一个,还是两个陈述的重定向?
    • @user66001 - 你真的运行了第二个编辑的代码吗?如果不存在,追加重定向将创建空文件。
    • Batch file contents & New file produced contents 总是有空行+破折号,每次删除.log文件后运行。
    【解决方案2】:

    检查括号。 (x) &gt;&gt; output.logx 的输出重定向到output.log。这意味着无论输出是什么,重定向都会发生,尤其是总是创建文件。

    现在,如果您编写 if Y (echo Text &gt;&gt; output.log),重定向将以 Y 为条件,并且可能不会发生。

    [编辑] 对于现在措辞的问题,简单的解决方案似乎是:

    1. 基于exist %test0% 设置%ERRORLEVEL%。此时未发生重定向。
    2. 使用%ERRORLEVEL% 来确定要做什么。您可以更改 %test0% 而无需更改 %ERRORLEVEL%

    顺便说一句,ERRORLEVEL is not %ERRORLEVEL%

    【讨论】:

    • 感谢 MSalters - 我原以为 if 语句不会解析 echo 的如果 exist 没有返回 true,因此没有输出发送到文件(虽然接受该文件可能已创建为空)。我实际上简化了这个问题,所以如果我可以问如何制作以下内容(根据您的回答,根据我的最佳猜测进行调整,这不起作用),if exist %test0% ((echo.&amp;echo.&amp;echo -------------------------------------------------&amp;echo.&amp;echo.) else (echo.))&gt;&gt;%test0% 将不胜感激。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    • 2013-02-11
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多