Пакетный файл - Ловля результата PSEXEC
Если я запускаю успешную команду PSEXEC, она говорит это...
msgstr "cmd вышел из рабочей станции. домен с кодом ошибки 0."
Есть ли способ, которым я могу предотвратить это и сделать что-то вроде
psexec \\workstation.domain -u username -p password cmd /c "assoc.pdf= "
if %errorlevel%==0 (
echo Success!
) else (
REM display psexec error here.
)
2 ответа
Поскольку мои правки были отклонены...
Размещен ли исходный код в более крупном скрипте? Если это так, то вы устанавливаете свой код ошибки, чтобы соответствовать переменной среды 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 в пакете, и вы используете ==, вам нужно заключить переменную и проверку значения в одиночные "" "отметки. Приведенный выше код исправляет эту проблему, а также заменяет код ошибки на 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
Для ссылки на 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