批处理文件 - 捕获 PSEXEC 结果

5
如果我成功运行PSEXEC命令,会显示以下内容:
“cmd exited on workstation.domain with error code 0.”(命令在计算机.workstation上退出,并带有错误代码0。)
有没有办法防止这种情况发生并执行类似以下操作:
psexec \\workstation.domain -u username -p password cmd /c "assoc.pdf= "
if %errorlevel%==0 (
  echo Success!
) else (
  REM display psexec error here.
)

编辑此内容 - 在检查 IF %var% = Value 时,应该用“ ' ”(引号)将%var%和变量都括起来。 - rud3y
另外,只是提一下,不确定你是否已经尝试过这个,但errcode不是一个环境变量,而ERRORLEVEL是。我不确定这是否是一个更大脚本的一部分,但如果不是的话,可以尝试用IF '%ERRORLEVEL%'=='0'(而不是'%errcode%')进行替换。 - rud3y
1
句子不应该是“有没有办法...”吗?(使用“IS”而不是“IF”) - Jocelyn
2个回答

6

由于我的编辑被拒绝...

原始代码是否是一个更大的脚本的一部分?如果是,那么您是否将errcode设置为匹配ERRORLEVEL环境变量?

psexec \\workstation.domain -u username -p password cmd /c "assoc.pdf= "
IF '%ERRORLEVEL%'=='0' (
  echo Success!
) else (
  REM display psexec error here.
)

每当尝试在批处理中确定 IF / THEN 时,您需要在变量和值检查周围使用单个 " ' "引号,这样才能使用 ==。上述代码不仅可以为您纠正此问题,还可以将 errcode 替换为 ERRORLEVEL,这是 Windows 的默认环境变量。
此外,在实践中,在任何 ERRORLEVEL 检查之前,我总是使用以下语句将初始值降低以正确捕获错误。
verify >nul

在这种情况下,我会采取以下措施:

verify >nul
psexec \\workstation.domain -u username -p password cmd /c "assoc.pdf= "
    IF '%ERRORLEVEL%'=='0' (
      echo Success!
    ) else (
      echo.Error is %ERRORLEVEL%; please see http://msdn.microsoft.com/en-us/library/ms681381(VS.85).aspx for more details.
    )

我为检查收到的错误添加了一个网址。

或者您可以自动打开相应页面的URL:

@ECHO OFF
    verify >nul
    set ERRCODE=0
    psexec \\workstation.domain -u username -p password cmd /c "assoc.pdf= "
        IF '%ERRORLEVEL%'=='0' (
          echo Success!
        ) else (
          set ERRCODE=%ERRORLEVEL%
        )
IF %ERRCODE% LEQ 499 set MSERROR=681382
IF %ERRCODE% GTR 500 set MSERROR=681388
IF %ERRCODE% GTR 1000 set MSERROR=681383
IF %ERRCODE% GTR 1300 set MSERROR=681385
IF %ERRCODE% GTR 1700 set MSERROR=681386
IF %ERRCODE% GTR 4000 set MSERROR=681387
IF %ERRCODE% GTR 6000 set MSERROR=681389
IF %ERRCODE% GTR 8200 set MSERROR=681390
IF %ERRCODE% GTR 9000 set MSERROR=681391
IF %ERRCODE% GTR 12000 set MSERROR=681384

IF ERRCODE NEQ 0 start http://msdn.microsoft.com/en-us/library/ms%MSERROR%(v=vs.85).aspx
IF ERRCODE NEQ 0 echo.This failed with ERROR: %ERRCODE%
pause

3

有关 psexec 的参考信息,请访问http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx

确定程序结果的第一步是识别所有返回值并检查是否设置了错误级别。

@echo off

:: Method 1, Handle a single line of output. No errorlevel support
for /f "usebackq delims=" %%A in (`psexec \\workstation.domain -u username -p password cmd /c "assoc.pdf= " ^| find /v "error code 0"`) do (
    rem Display the error
    echo.%%A
    goto Failed
)
echo.Success
:Failed


:: Method 2, Handle multiple lines of output. No errorlevel support
for /f "usebackq delims=" %%A in (`psexec \\workstation.domain -u username -p password cmd /c "assoc.pdf= "`) do (
    rem Check the status
    for /f "usebackq delims=" %%X in (`echo."%%~A" ^| find /v "error code 0"`) do (
        echo.%%X
    )
    for /f "usebackq delims=" %%X in (`echo."%%~A" ^| find "error code 0"`) do (
        echo.Success
    )
)


:: Method 3, Supports error level variable; only works if the called program supports it.
verify > nul
psexec \\workstation.domain -u username -p password cmd /c "assoc.pdf= "> nul
if %ERRORLEVEL% EQU 0 echo.Success
if %ERRORLEVEL% NEQ 0 echo.Error


:: Method 4, specific error message with error level, requires delayed expansion.
setlocal enabledelayedexpansion
verify > nul
for /f "usebackq delims=" %%A in (`psexec \\workstation.domain -u username -p password cmd /c "assoc.pdf= "`) do (
    if !ERRORLEVEL! EQU 0 echo.Success
    if !ERRORLEVEL! NEQ 0 echo.%%A
)
endlocal

pause

2
方法3不起作用。如果ERRORLEVEL为0,则echo.Success将正确地回显Success,但不正确。如果ERRORLEVEL不为0,则echo.%%A永远不会发生,因为即使您的错误代码为1或更高,语法也是错误的。 - rud3y
@rud3y,你能具体说明一下我示例中的问题吗?因为我在许多脚本中都成功使用了if not ERRORLEVEL 0 echo.%%A语法的哪个部分是错误的。 - David Ruhmann
3
@DavidRuhmann - 当本应出现失败时,我也得到了成功。 - user1264889
3
@rud3y - 很好的发现,这个问题是否只限于操作系统?你也在使用Windows 7吗?(在Windows XP或Server 2003+中是否有所不同?) - user1264889
3
谢谢@rud3y和@Mechanic12386指出问题,我没有测试我的答案。我进一步研究了一下,发现这是一个ERRORLEVEL的问题。当使用if ERRORLEVEL # do时,实际上进行以下比较 if ERRORLEVEL >= # do。然而,这取决于Windows版本是否有问题。基于负数,NT4+ (2000/XP+) 的推荐方法是使用if %ERRORLEVEL% EQU#。已更新我的答案。参考:http://www.robvanderwoude.com/errorlevel.php - David Ruhmann
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接