Batch file 批处理文件-捕获PSEXEC结果

Batch file 批处理文件-捕获PSEXEC结果,batch-file,psexec,Batch File,Psexec,如果我运行一个成功的PSEXEC命令,它会这样说… “已在workstation.domain上退出cmd,错误代码为0。” 有没有什么方法可以防止这种情况发生,并采取类似的措施 psexec \\workstation.domain -u username -p password cmd /c "assoc.pdf= " if %errorlevel%==0 ( echo Success! ) else ( REM display psexec error here. ) 参考pse

如果我运行一个成功的PSEXEC命令,它会这样说…
“已在workstation.domain上退出cmd,错误代码为0。”

有没有什么方法可以防止这种情况发生,并采取类似的措施

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

参考
psexec

确定程序结果时的第一步是确定所有返回值以及是否设置了errorlevel

@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

因为我的编辑被拒绝了

发布的原始代码是较大脚本的一部分吗?如果是,那么您是否将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并使用==时,都需要在单个“'”标记中加上变量和值check。上面的代码为您纠正了这个问题,并将errcode替换为ERRORLEVEL,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.
    )
我添加了一个weburl,用于检查收到的错误

或者,您可以自动打开相应页面的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

编辑此项-检查%var%=值时,%var%和变量都应该用“'”(勾号)括起来。另外,请注意,还不确定您是否尝试过此操作,但errcode不是环境变量,而是ERRORLEVEL。我不确定这是否是更大脚本的一部分,但如果不是,请尝试将“%ERRORLEVEL%”替换为“%0”(…而不是“%errcode%”,句子不应该是“有任何方法…”?(“是”而不是“如果”)方法3不起作用。如果ERRORLEVEL 0 echo.Success将正确地回显成功,但不正确。如果ERRORLEVEL 0 echo.%%A将永远不会出现,因为即使错误为1或更高,语法也是错误的。@rud3y能否更具体地说明我的示例中的问题?如果不是ERRORLEVEL 0 echo.%%A,语法的哪一部分是
的>错误,因为我在我的许多脚本中成功地使用了它。@DavidRuhmann-当出现故障时,我也会成功。@rud3y-很好的回答,这是针对操作系统的吗?您是否也运行Windows 7?(在Windows XP或Server 2003+上这是不同的吗?)@rud3y@Mechanic12386谢谢你的提示;我还没有测试我的答案。我进一步研究了它,发现它是ERRORLEVEL的问题。当使用
if ERRORLEVEL#do
时,它实际上执行了以下比较
if ERRORLEVEL>=\do
。但是,这取决于windows版本。建议由于负数,NT4+(2000/XP+)的改进方法是使用if
if%ERRORLEVEL%eq
。更新了我的答案。参考: