Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] tasklist "Фильтр не опознан" или "Трудности перевода"

Ответить
Настройки темы
CMD/BAT - [решено] tasklist "Фильтр не опознан" или "Трудности перевода"

Новый участник


Сообщения: 20
Благодарности: 1

Профиль | Отправить PM | Цитировать


Изменения
Автор: awkozlov
Дата: 28-05-2013
Существует проблема перевода 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

Отправлено: 22:12, 28-05-2013

 

Ветеран


Сообщения: 874
Благодарности: 575

Профиль | Отправить 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
Благодарности: 1

Профиль | Отправить 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
Благодарности: 575

Профиль | Отправить PM | Цитировать


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

Отправлено: 00:29, 29-05-2013 | #4


Новый участник


Сообщения: 20
Благодарности: 1

Профиль | Отправить 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
Код: Выделить весь код
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, 30-05-2013 в 01:13.


Отправлено: 20:34, 29-05-2013 | #5


Ветеран


Сообщения: 874
Благодарности: 575

Профиль | Отправить PM | Цитировать


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

Отправлено: 21:01, 29-05-2013 | #6


Новый участник


Сообщения: 20
Благодарности: 1

Профиль | Отправить 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
Благодарности: 575

Профиль | Отправить PM | Цитировать


awkozlov, вот так:
Код: Выделить весь код
for /f "skip=3 tokens=2 delims= " %%i in ('tasklist /FI "%f2%" ^| find /i "%1"') do (set /a zPID=%%i)
Это сообщение посчитали полезным следующие участники:

Отправлено: 07:58, 30-05-2013 | #8


Новый участник


Сообщения: 20
Благодарности: 1

Профиль | Отправить 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
Код: Выделить весь код
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%

Последний раз редактировалось awkozlov, 02-06-2013 в 20:24.


Отправлено: 02:38, 31-05-2013 | #9


Ветеран


Сообщения: 2183
Благодарности: 721

Профиль | Отправить PM | Цитировать


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

Последний раз редактировалось sov44, 29-10-2016 в 18:12.


Отправлено: 17:57, 29-10-2016 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] tasklist "Фильтр не опознан" или "Трудности перевода"

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Интерфейс - как искать в содержимом файлов не "слово или фразу", а "вхождение символов"? 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




 
Переход