Показать полную графическую версию : [решено] 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
Для кодовых страниц:
@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.
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%
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
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%
Столкнулся с непонятной проблемой - на Windows 7 команда работает, на Windows XP пишет, что фильтр поиска не опознан. Как исправить ошибку на XP?
tasklist /fi "username eq %username%"
решено.
tasklist /fi "Пользователь eq %username%"
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.