2015-12-12 4 views
0

У меня есть один фрагмент кода, который ведет себя по-другому, когда я запускал его на сервере, и когда я запускал его с помощью psexec. Я на самом деле пытаюсь удержать компьютер в автономном режиме, но это не вопрос. Проблема в том, что когда я запускаю эту команду непосредственно на сервере, уровень ошибок меняется на 1, поскольку компьютер находится в сети. Но когда я использую psexec для запуска файла с теми же командами на этом сервере, уровень errorelevel не меняется, он остается 0. Я не могу найти никаких объяснений в Интернете.Уровень ошибки не изменяется при запуске файла с psexec

echo %errorlevel% 

ping -n 1 machine | findstr "not" > nul 
IF %errorlevel%==0 (
    echo test 
) 

echo %errorlevel% 

pause 

ответ

1

Что вы показываете это не команда, а пакетный файл, скажем ping_machine.cmd. Чтобы вызвать его из psexec, командная строка будет примерно psexec \\server cmd /c ping_machine.cmd. Если я ошибаюсь, вы можете перестать читать остальную часть этого ответа сейчас (и в следующий раз опубликуйте достаточно соответствующего контекста, чтобы не догадываться).

Проблема заключается в том, что cmd /c возвращает код выхода ping_machine, но командный файл явно не устанавливает код выхода, поэтому он возвращает 0 по умолчанию. Это можно проверить в командной строке cmd со следующими двумя прогонами - обратите внимание, что внутри командного файла вы видите одинаковые/правильные уровни ошибок, но cmd /c возвращает 0.

C:\etc>ping_machine 
0 
1 
Press any key to continue . . . 

C:\etc>echo %errorlevel% 
1 

C:\etc>cmd /c ping_machine 
0 
1 
Press any key to continue . . . 

C:\etc>echo %errorlevel% 
0 

Чтобы cmd /c ведут себя, как вы ожидаете (и, в свою очередь psexec, а), добавьте следующую строку в конце пакетного файла, чтобы вернуть соответствующий ErrorLevel (это работает, потому что ни echo, ни pause изменения errorlevel , в противном случае вам придется сохранить его в переменной temp для последующего использования).

exit /b %errorlevel% 
+0

Проблема заключается в том, что у меня есть пакетный файл, что я бегу с pcexec командой. В этом пакетном файле у меня есть код, который использует '% errorlevel%' для сравнения. Проблема в этом; Когда я запускаю этот файл локально, '% errorlevel% 'изменяется соответствующим образом, но когда я запускаю этот файл на удаленной машине'% errorlevel% 'не меняется, он остается 0. – IGRACH

+2

@IGRACH Пожалуйста, разместите полную строку psexec и командный файл (s). – dxiv

0

Это не так. Когда я запускаю этот пакетный файл локально Равен изменяется на 9009. При использовании psexec \\computername -f -c pathToFile, код ошибки гостит 0.

@echo off 
echo %errorlevel% 
pin 234343 
echo %errorlevel% 
pause