1

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

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

有谁知道出了什么问题?

@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条件中没有一个),并errorlevel根据exist文件的 ance 进行设置?

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

4

2 回答 2

2

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

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

您可以使用 将 ERRORLEVEL 强制为您选择的任何特定值cmd /c exit /b N,其中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
)
于 2013-02-05T15:17:41.447 回答
0

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

现在,如果您编写if Y (echo Text >> output.log)重定向将取决于Y,并且可能不会发生。

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

  1. 基于. %ERRORLEVEL%_ exist %test0%此时没有发生重定向。
  2. 用于%ERRORLEVEL%确定要做什么。您可以更改%test0%而不更改%ERRORLEVEL%.

顺便说一句,ERRORLEVEL 不是 %ERRORLEVEL%

于 2013-02-05T08:16:21.373 回答