Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] tasklist "Фильтр не опознан" или "Трудности перевода" (http://forum.oszone.net/showthread.php?t=261414)

awkozlov 28-05-2013 22:12 2158081

tasklist "Фильтр не опознан" или "Трудности перевода"
 
Существует проблема перевода Windows
который критично влияет на выполнение команды tasklist на разных виндах.

Написал код, чтобы наверняка определяла есть зависшие процессы или нет.

Проблема в том, что батник опрашивает 3 раза (по 3 кодовым страницам) на английском и русском итого 6 раз. А tasklist отрабатывает не быстро...

Как можно заранее перед запуском tasklist определить кодовую страницу на которую переведен windows и язык,
чтоб не вызывать лишние 5 раз tasklist ? Как лучше поправить этот код?

Вызов.bat
Код:

call _NoProc notepad.exe
@Echo ERRORLEVEL=%ERRORLEVEL%
Pause

_NoProc.bat
Код:

@Echo off

chcp 1252

tasklist /fi "STATUS eq not responding"  /fo table /nh | find /i "%1%"
if %ERRORLEVEL%==0 exit /b 0

tasklist /fi "Состояние eq not responding"  /fo table /nh | find /i "%1%"
if %ERRORLEVEL%==0 exit /b 0

chcp 1251

tasklist /fi "STATUS eq not responding"  /fo table /nh | find /i "%1%"
if %ERRORLEVEL%==0 exit /b 0

tasklist /fi "Состояние eq not responding"  /fo table /nh | find /i "%1%"
if %ERRORLEVEL%==0 exit /b 0

chcp 866

tasklist /fi "STATUS eq not responding"  /fo table /nh | find /i "%1%"
if %ERRORLEVEL%==0 exit /b 0

tasklist /fi "Состояние eq not responding"  /fo table /nh | find /i "%1%"
if %ERRORLEVEL%==0 exit /b 0


exit /b 1


Georgio 28-05-2013 23:25 2158120

Для кодовых страниц:



Код:

@ECHO OFF

FOR /F "tokens=2 delims=:" %%I IN ('CHCP') DO SET /A CP=%%I

IF %CP%==1252 GOTO 1252
IF %CP%==1251 GOTO 1251
IF %CP%==866 GOTO 866


:1252
chcp

tasklist /fi "STATUS eq not responding"  /fo table /nh | find /i "%1%"
if %ERRORLEVEL%==0 exit /b 0

tasklist /fi "Состояние eq not responding"  /fo table /nh | find /i "%1%"
if %ERRORLEVEL%==0 exit /b 0

EXIT /B 1


:1251
chcp

tasklist /fi "STATUS eq not responding"  /fo table /nh | find /i "%1%"
if %ERRORLEVEL%==0 exit /b 0

tasklist /fi "Состояние eq not responding"  /fo table /nh | find /i "%1%"
if %ERRORLEVEL%==0 exit /b 0

EXIT /B 1


:866
chcp

tasklist /fi "STATUS eq not responding"  /fo table /nh | find /i "%1%"
if %ERRORLEVEL%==0 exit /b 0

tasklist /fi "Состояние eq not responding"  /fo table /nh | find /i "%1%"
if %ERRORLEVEL%==0 exit /b 0

EXIT /B 1


awkozlov 29-05-2013 00:19 2158143

Georgio - спасибо за решение, но видимо кодовая страница в другом месте Windows... где-нибудь в реестре

На русифицированном XP x64

выдает Кодовая страница 866 и дальше 2 раза "Фильтр поиска не опознан"

Но если я запущу с кодовой страницей 1252 то зависший процесс найдется.
Отреагирует на 1-ю строку "STATUS eq not responding" кодовой страницы 1252,
хотя текущую (по FOR /F "tokens=2 delims=:" %%I IN ('CHCP') DO SET /A CP=%%I) покажет 866.

Georgio 29-05-2013 00:29 2158150

awkozlov, я об этом тоже думал и знаю, где она в реестре. Надо только всё сопоставить. Буду думать дальше.

awkozlov 29-05-2013 20:34 2158774

К сожалению проблема переводов Windows осталась не решенной, но я пока, кривовато правда, но надежно) усовершенствовал код.
Теперь возвращает
>0 =процесс есть и не отвечает (возвращает ID-процесса (PID) для последующего его убийства и перезапуска)
0 = процесс есть и работает
-1 = процесса нет
Не возражаю если сделаете покрасивее )
В частности хотелось бы заменить
for /f "skip=3 tokens=2 delims= " %%i in ('tasklist /FI "%f11%" /FI "%f2%"') do (set /a zPID=%%i)
на
for /f "skip=3 tokens=2 delims= " %%i in ('tasklist /FI "%f2%" | find /i "%1%") do (set /a zPID=%%i)
это повысило бы надежность, но почему-то FIND в for не работает...

Вызов.cmd
Код:

call _IsProc notepad.exe
@Echo ERRORLEVEL=%ERRORLEVEL%
Pause

_IsProc.cmd
Код:

@Echo off

chcp 1252>nul
set f2=STATUS eq not responding
tasklist /fi "%f2%" /fo table /nh | find /i "%1%">nul
if %ERRORLEVEL%==0 goto :GetPIDExit

set f2=Состояние eq not responding
tasklist /fi "%f2%" /fo table /nh | find /i "%1%">nul
if %ERRORLEVEL%==0 goto :GetPIDExit

chcp 1251>nul
set f2=STATUS eq not responding
tasklist /fi "%f2%" /fo table /nh | find /i "%1%">nul
if %ERRORLEVEL%==0 goto :GetPIDExit

set f2=Состояние eq not responding
tasklist /fi "%f2%" /fo table /nh | find /i "%1%">nul
if %ERRORLEVEL%==0 goto :GetPIDExit

chcp 866>nul
set f2=STATUS eq not responding
tasklist /fi "%f2%" /fo table /nh | find /i "%1%">nul
if %ERRORLEVEL%==0 goto :GetPIDExit

set f2=Состояние eq not responding
tasklist /fi "%f2%" /fo table /nh | find /i "%1%">nul
if %ERRORLEVEL%==0 goto :GetPIDExit

chcp 1251>nul
set f1e=IMAGENAME eq %1%
tasklist /fi "%f1e%" /fo table /nh | find /i "%1%">nul
if %ERRORLEVEL%==0 exit /b 0

set f1r=Имя образа eq %1%
tasklist /fi "%f1r%" /fo table /nh | find /i "%1%">nul
if %ERRORLEVEL%==0 exit /b 0

chcp 1252>nul

set f1e=IMAGENAME eq %1%
tasklist /fi "%f1e%" /fo table /nh | find /i "%1%">nul
if %ERRORLEVEL%==0 exit /b 0

set f1r=Имя образа eq %1%
tasklist /fi "%f1r%" /fo table /nh | find /i "%1%">nul
if %ERRORLEVEL%==0 exit /b 0

chcp 866>nul

set f1e=IMAGENAME eq %1%
tasklist /fi "%f1e%" /fo table /nh | find /i "%1%">nul
if %ERRORLEVEL%==0 exit /b 0

set f1r=Имя образа eq %1%
tasklist /fi "%f1r%" /fo table /nh | find /i "%1%">nul
if %ERRORLEVEL%==0 exit /b 0

exit /b -1

:GetPIDExit

set /a zPID=0

set f1e=IMAGENAME eq %1%
set f1r=Имя образа eq %1%
for /f "skip=3 tokens=2 delims= " %%i in ('tasklist /FI "%f1e%" /FI "%f2%"') do (set /a zPID=%%i)
if %zPID%==0 (for /f "skip=3 tokens=2 delims= " %%i in ('tasklist /FI "%f1r%" /FI "%f2%"') do (set /a zPID=%%i))

if %zPID%==0 (
chcp 1252
set f1e=IMAGENAME eq %1%
set f1r=Имя образа eq %1%
for /f "skip=3 tokens=2 delims= " %%i in ('tasklist /FI "%f1e%" /FI "%f2%"') do (set /a zPID=%%i)
if %zPID%==0 (for /f "skip=3 tokens=2 delims= " %%i in ('tasklist /FI "%f1r%" /FI "%f2%"') do (set /a zPID=%%i))
)

if %zPID%==0 (
chcp 1251
set f1e=IMAGENAME eq %1%
set f1r=Имя образа eq %1%
for /f "skip=3 tokens=2 delims= " %%i in ('tasklist /FI "%f1e%" /FI "%f2%"') do (set /a zPID=%%i)
if %zPID%==0 (for /f "skip=3 tokens=2 delims= " %%i in ('tasklist /FI "%f1r%" /FI "%f2%"') do (set /a zPID=%%i))
)

if %zPID%==0 (
chcp 866
set f1e=IMAGENAME eq %1%
set f1r=Имя образа eq %1%
for /f "skip=3 tokens=2 delims= " %%i in ('tasklist /FI "%f1e%" /FI "%f2%"') do (set /a zPID=%%i)
if %zPID%==0 (for /f "skip=3 tokens=2 delims= " %%i in ('tasklist /FI "%f1r%" /FI "%f2%"') do (set /a zPID=%%i))
)

exit /b %zPID%


Georgio 29-05-2013 21:01 2158791

awkozlov, удивительно, но я тоже тоже сегодня думал о подобном анализе. Посмотрю обязательно. Кстати, уже вижу, почему не работает цикл, -- нужно зкранировать "|": "^|".

awkozlov 30-05-2013 02:24 2158966

Georgio, что-то не вяжется у меня с экранизацией в цикле

Так работает
for /f "skip=3 tokens=2 delims= " %%i in ('tasklist /FI "%f2%"') do (set /a zPID=%%i)

А так нет
for /f "skip=3 tokens=2 delims= " %%i in ('tasklist /FI "%f2%" | find /i "%1%"') do (set /a zPID=%%i)
for /f "skip=3 tokens=2 delims= " %%i in ('tasklist /FI "%f2%" ^| find /i "%1%"') do (set /a zPID=%%i)
for /f "skip=3 tokens=2 delims= " %%i in ('tasklist /FI "%f2%" ^| find /i "%1%"^') do (set /a zPID=%%i)
for /f "skip=3 tokens=2 delims= " %%i in ('tasklist /FI "%f2%" | find /i "%1%"^') do (set /a zPID=%%i)
просто закрывает cmd

Georgio 30-05-2013 07:58 2159015

awkozlov, вот так:
Код:

for /f "skip=3 tokens=2 delims= " %%i in ('tasklist /FI "%f2%" ^| find /i "%1"') do (set /a zPID=%%i)

awkozlov 31-05-2013 02:38 2159661

Сделал в пару строк. Как-то так.

Правда хотелось бы поизящнее, без использования файла tmp_IsTk.txt двойным поиском в FOR
for /f "skip=2 tokens=2 delims= " %%i in ('tasklist /v ^| find /i "%1" ^& ^| find /i "Running"') do (set /a zPID=0)
for /f "skip=2 tokens=2 delims= " %%i in ('tasklist /v ^| find /i "%1" ^& ^| find /i "not responding"') do (set /a zPID=%%i)
но пишет "Непредвиденное появление: |."

Вызов.cmd
Код:

call _IsTask notepad.exe
@Echo ERRORLEVEL=%ERRORLEVEL%
Pause

_IsTask.cmd
Код:

@Echo off

FOR /F "tokens=2 delims=:" %%I IN ('CHCP') DO SET /A CP=%%I

chcp 1252 >nul

set /a zPID=-1
tasklist /v | find /i "%1">%TEMP%\tmp_IsTk.txt
for /f "skip=2 tokens=2 delims= " %%i in ('find /i "Running" %TEMP%\tmp_IsTk.txt') do (set /a zPID=0)
for /f "skip=2 tokens=2 delims= " %%i in ('find /i "not responding" %TEMP%\tmp_IsTk.txt') do (set /a zPID=%%i)
chcp %CP% >nul

del %TEMP%\tmp_IsTk.txt
exit /b %zPID%


sov44 29-10-2016 17:57 2682788

Столкнулся с непонятной проблемой - на Windows 7 команда работает, на Windows XP пишет, что фильтр поиска не опознан. Как исправить ошибку на XP?
Код:

tasklist /fi "username eq %username%"
решено.
Код:

tasklist /fi "Пользователь eq %username%"

alpap 30-10-2016 03:44 2682925

awkozlov,
Позвольте поинтересоваться, что мешает переменной %zPID% стать нулем в строке
Цитата:

Цитата awkozlov
for /f "skip=2 tokens=2 delims= " %%i in ('find /i "Running" %TEMP%\tmp_IsTk.txt') do (set /a zPID=0) »

при положительном или отрицательном поиске слова в файле, т.е. зачем нужна эта строка или зачем нужна в таком виде, запись "set /a zPID=0" - будет означать тоже самое.

Цитата:

Цитата awkozlov
но пишет "Непредвиденное появление: | »

правильно так (для вашего кода, так как такую запись правильной тоже лучше не считать):
Код:

for /f "skip=2 tokens=2 delims= " %%i in ('tasklist /v ^| find /i "%1" ^| find /i "not responding"') do (set /a zPID=%%i)


Время: 11:03.

Время: 11:03.
© OSzone.net 2001-