CMD - 如果存在<file> </file>

时间:2013-02-05 08:10:36

标签: redirect if-statement cmd exists

根据我的理解,下面的命令(添加了调试行 - 缩进)应该只将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.&echo.&echo -------------------------------------------------&echo.&echo.) else (set /p .=<nul)>>%test0%&set errorlevel=0||set errorlevel=1

我如何将if匹配输出的条件设置为文件(希望只有一个文件引用,即每个if条件中没有一个),并且{{{ 1}}根据文件的errorlevel设置?

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

2 个答案:

答案 0 :(得分:2)

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

您可以通过运行具有已知结果的命令将ERRORLEVEL强制为某个值,并在必要时将输出重定向到nul:ver >nul将ERRORLEVEL设置为0,set /p .=<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
)

编辑以回应评论

不需要太多改变。

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

答案 1 :(得分:0)

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

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

<强> [编辑] 现在问题就在于它,简单的解决方案似乎是:

  1. 根据%ERRORLEVEL%设置exist %test0%。此时没有发生重定向。
  2. 使用%ERRORLEVEL%确定要执行的操作。您可以在不改变%test0%的情况下更改%ERRORLEVEL%
  3. BTW,ERRORLEVEL is not %ERRORLEVEL%