|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] tasklist "Фильтр не опознан" или "Трудности перевода" |
|
|
CMD/BAT - [решено] tasklist "Фильтр не опознан" или "Трудности перевода"
|
Новый участник Сообщения: 20 |
Профиль | Отправить PM | Цитировать
Существует проблема перевода Windows
который критично влияет на выполнение команды tasklist на разных виндах. Написал код, чтобы наверняка определяла есть зависшие процессы или нет. Проблема в том, что батник опрашивает 3 раза (по 3 кодовым страницам) на английском и русском итого 6 раз. А tasklist отрабатывает не быстро... Как можно заранее перед запуском tasklist определить кодовую страницу на которую переведен windows и язык, чтоб не вызывать лишние 5 раз tasklist ? Как лучше поправить этот код? Вызов.bat _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 |
|
Отправлено: 22:12, 28-05-2013 |
Ветеран Сообщения: 874
|
Профиль | Отправить PM | Цитировать Для кодовых страниц:
@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 |
Отправлено: 23:25, 28-05-2013 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 20
|
Профиль | Отправить PM | Цитировать 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. |
Отправлено: 00:19, 29-05-2013 | #3 |
Ветеран Сообщения: 874
|
Профиль | Отправить PM | Цитировать awkozlov, я об этом тоже думал и знаю, где она в реестре. Надо только всё сопоставить. Буду думать дальше.
|
Отправлено: 00:29, 29-05-2013 | #4 |
Новый участник Сообщения: 20
|
Профиль | Отправить PM | Цитировать К сожалению проблема переводов 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 _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, 30-05-2013 в 01:13. Отправлено: 20:34, 29-05-2013 | #5 |
Ветеран Сообщения: 874
|
Профиль | Отправить PM | Цитировать awkozlov, удивительно, но я тоже тоже сегодня думал о подобном анализе. Посмотрю обязательно. Кстати, уже вижу, почему не работает цикл, -- нужно зкранировать "|": "^|".
|
Отправлено: 21:01, 29-05-2013 | #6 |
Новый участник Сообщения: 20
|
Профиль | Отправить PM | Цитировать 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 |
Отправлено: 02:24, 30-05-2013 | #7 |
Ветеран Сообщения: 874
|
Профиль | Отправить PM | Цитировать |
Отправлено: 07:58, 30-05-2013 | #8 |
Новый участник Сообщения: 20
|
Профиль | Отправить PM | Цитировать Сделал в пару строк. Как-то так.
Правда хотелось бы поизящнее, без использования файла 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 _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% |
Последний раз редактировалось awkozlov, 02-06-2013 в 20:24. Отправлено: 02:38, 31-05-2013 | #9 |
Ветеран Сообщения: 2190
|
Профиль | Отправить PM | Цитировать |
Последний раз редактировалось sov44, 29-10-2016 в 18:12. Отправлено: 17:57, 29-10-2016 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Интерфейс - как искать в содержимом файлов не "слово или фразу", а "вхождение символов"? | w95w7 | Microsoft Windows 2000/XP | 0 | 11-10-2011 18:41 | |
Интерфейс - drag&drop - пиктограмки "плюсик" или "стрелка" не появляются | bk99 | Microsoft Windows 2000/XP | 0 | 14-11-2010 14:21 | |
Не получается найти все выпуски "Хакер"+"спец"+"железо" | verdix | Хочу все знать | 5 | 29-11-2008 15:19 | |
Запретить/удалить пункт "Programs" ("Программы") из меню кнопки "Start" ("Пуск") | submaster | Microsoft Windows NT/2000/2003 | 5 | 13-09-2006 12:29 | |
"Вход в систему недоступен" или "Не найден сервер для проверки пароля входа в сеть" | rooty | Microsoft Windows NT/2000/2003 | 8 | 23-08-2005 02:18 |
|