PDA

Показать полную графическую версию : [решено] tasklist "Фильтр не опознан" или "Трудности перевода"


awkozlov
28-05-2013, 22:12
Существует проблема перевода Windows (http://parazitizm.ru/cmd-tasklist-po-russki.html)
который критично влияет на выполнение команды 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
Для кодовых страниц:



@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
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
awkozlov, я об этом тоже думал и знаю, где она в реестре. Надо только всё сопоставить. Буду думать дальше.

awkozlov
29-05-2013, 20:34
К сожалению проблема переводов Windows (http://parazitizm.ru/cmd-tasklist-po-russki.html) осталась не решенной, но я пока, кривовато правда, но надежно) усовершенствовал код.
Теперь возвращает
>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
awkozlov, удивительно, но я тоже тоже сегодня думал о подобном анализе. Посмотрю обязательно. Кстати, уже вижу, почему не работает цикл, -- нужно зкранировать "|": "^|".

awkozlov
30-05-2013, 02:24
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
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
Сделал в пару строк. Как-то так.

Правда хотелось бы поизящнее, без использования файла 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
Столкнулся с непонятной проблемой - на Windows 7 команда работает, на Windows XP пишет, что фильтр поиска не опознан. Как исправить ошибку на XP?
tasklist /fi "username eq %username%"

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

alpap
30-10-2016, 03:44
awkozlov,
Позвольте поинтересоваться, что мешает переменной %zPID% стать нулем в строке
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" - будет означать тоже самое.

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

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




© OSzone.net 2001-2012