根据我的理解,下面的命令(添加了调试行 - 缩进)应该只将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
设置?
任何人都可以帮助解决实际的完整命令问题吗?
答案 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.log
将x
的输出重定向到output.log
。这意味着无论输出是什么,重定向都会发生,特别是总是创建文件。
现在,如果你写if Y (echo Text >> output.log)
,重定向将以Y
为条件,并且可能不会发生。
<强> [编辑] 强> 现在问题就在于它,简单的解决方案似乎是:
%ERRORLEVEL%
设置exist %test0%
。此时没有发生重定向。%ERRORLEVEL%
确定要执行的操作。您可以在不改变%test0%
的情况下更改%ERRORLEVEL%
。