2012-12-12 92 views
4

如果我运行一个成功的PSEXEC命令,它说这...
“cmd在workstation.domain上退出,错误代码为0”。批处理文件 - 捕捉PSEXEC结果

有没有办法确定程序结果时,我可以阻止它,这样做

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

编辑这一点 - 当检查IF%VAR%=值两者%VAR%和变应以“'”包围(蜱) – rud3y

+0

此外,只是要注意,不知道如果你尝试过这个,但errcode不是一个environement变量,但ERRORLEVEL是。我不知道这是否是一个更大的脚本的一部分,但如果没有,尝试替代IF“%ERRORLEVEL%” ==“0”(...而不是“%ERRCODE%” – rud3y

+1

不应该被判刑“有什么办法......”?( “IS”,而不是 “IF”) – Jocelyn

回答

5

因为我编辑的被拒绝......

原代码发布了较大的脚本的一部分?如果是这样,那么你是否设置你的errcode来匹配ERRORLEVEL环境变量?

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

每当试图detemine IF/THEN批量和你使用==你需要用来包围变量和单“'”标记的valuecheck。上面的代码为您纠正了这个问题,并用ERRORLEVEL替代了errcode,这是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 
2

对于参考psexechttp://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将正确呼应成功,但不正确的。如果没有ERRORLEVEL 0回声% %A将永远不会发生,因为即使你的错误是1或更高的语法是错误的。 – rud3y

+0

@ rud3y你能否具体谈谈我的例子中,问题是什么?部分语法'如果不是ERRORLEVEL 0回音。%% 。A'错了,因为我已经在我的许多脚本中使用这个成功 –

+0

没问题,我做了一个简单的批处理文件来测试这一点:复制不存在其他不存在,那么我回声一个错误级别目录(这是,如预期的那样,1)包括你的两个命令(IF ERRORLEVEL 0 echo.Success)和(IF NOT ERRORLEVEL 0 echo.ERROR),I con一直得到SUCCESS和1 – rud3y