查找命令始终将errorlevel返回为零

时间:2014-10-13 08:55:52

标签: windows batch-file cmd

我正在尝试使用以下代码

使用tasklist命令获取远程进程的状态
for /f "tokens=1-2 delims=," %%A in (TaskList.txt) do (
        SET ServerName=
        SET taskName=
        SET _ServerName=%%A
        SET _taskName=%%B

        echo !_ServerName!,!_taskName!

        tasklist.exe /s !_ServerName! /u nbccadmin /p Project@123 /FI " IMAGENAME eq !_taskName!" > Result.txt

        Find /i "PID" < Result.txt
        echo %ERRORLEVEL%
        IF %ERRORLEVEL% == 0 (
            echo !_ServerName!,!_taskName!,Running >> TaskStatus.csv
        )

        find /i "No tasks are running" < Result.txt
        echo %ERRORLEVEL%
        IF %ERRORLEVEL%==0 (
            echo !_ServerName!,!_taskName!,Not Running >> TaskStatus.csv
        )
    )

我面临的问题是,当我使用FIND命令搜索值&#34; PID&#34;或&#34;没有任务正在运行&#34;,返回的ERRORLEVEL始终为0,即使进程未运行。

我不知道为什么会这样。

请帮我解决这个问题

1 个答案:

答案 0 :(得分:2)

在块语句(a parenthesised series of statements)中,解析整个块并执行然后。块中的任何%var%将在解析块时被该变量的值替换 - 在块执行之前 - 同样的事情适用于FOR ... DO (block)。< / p>

因此,%errorlevel%会在分析时被errorlevel的值替换。

您可以使用!errorlevel!,因为您显然已调用enabledelayedexpansion(因为您使用!var!但未向我们展示整个批次。)

或者您可以使用原始格式的errorlevel

if errorlevel n dosomething

如果errorleveln 或大于 n,则为真。在此表单中,errorlevelerrorlevel运行时值。

由于您对errorlevel==0感兴趣,因此常见表格为

if not errorlevel 1 (dothis) else (dothat)

(即使我厌恶双重否定。)