2012-12-12 89 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