Сейчас на форуме: 2nd, morgot, Rio, CDK123, zds, tyns777, tihiy_grom (+5 невидимых)

 eXeL@B —› Программирование —› Разборка bat файла
Посл.ответ Сообщение


Ранг: 106.9 (ветеран), 27thx
Активность: 0.080
Статус: Участник

Создано: 22 сентября 2008 19:22 · Поправил: Oott
· Личное сообщение · #1

Вобщем тут такое дело, я ни когда ни чего не кодил в батнике(т.к. думаю особо там не разгуляешься), кроме, как может быть start exe . И тут вдруг попалось мне задание подготовить отчёт по собствено этому батнику.Звучит оно примерно так:
Code:
  1. В командной строке через пробел заданы одна или более букв латинского алфавита, 
  2. а также ключ с возможными значениями: /ASC - «по возрастанию», /DESC - «по убыванию». 
  3. Необходимо написать программу, в результате которой на экран
  4. были бы выведены имена всех задач, начинающиеся с букв, перечисленных в
  5. командной строке, отсортированные в зависимости от ключа сортировки,
  6.  внутри группы для каждой заданной буквы.
  7.  Если ни одной задачи на указанные буквы не найдено,
  8.  то необходимо вывести соответствующее сообщение.

НУ собствено разбирая инфу смог написать только сортировку процессов по алфавиту по возрастанию и убыванию:
Code:
  1. @echo off
  2. IF /%1 == //ASC (Tasklist | SORT
  3. ) ELSE (IF /%1== //DESC (Tasklist | SORT/R
  4. ) ELSE (@echo Error32: 1 parameter incorrect!))

Но как сделать например чтоб вывелись все процессы на чинающиеся по имени на определённую буквуО_о хз. Оч прошу помочь, т.к. сильно всё это важно.
+Написал я это всё не просто так, хотелось бы узнать как можно правильнее написать этот код батника.
P.s.как-то надо там с SORT/n мутить , но чёт у меня не выходит
P.S.p.s.: поиск юзал, ни чего серьезного на эту тему не нашел.




Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 22 сентября 2008 19:42
· Личное сообщение · #2

Где ты учишся, что вам такое задают?

-----
Лучше быть одиноким, но свободным © $me





Ранг: 106.9 (ветеран), 27thx
Активность: 0.080
Статус: Участник

Создано: 22 сентября 2008 19:49 · Поправил: Oott
· Личное сообщение · #3

borov, офф: спалюсь нафиг, препод мож на кряклабе сидит .
2 курс, отчет по ОС. Ну вобщем профа такя




Ранг: 467.7 (мудрец), 5thx
Активность: 0.270
Статус: Участник
Иной :)

Создано: 22 сентября 2008 20:21 · Поправил: [HEX]
· Личное сообщение · #4

Oott
Ты справку по tasklist читал хоть? Если не в курсе, то tasklist /?
В примере написано же как отфильтровать процессы.
Вот тебе отфильтрованые процессы на букву s
tasklist /NH /FI "IMAGENAME eq s*" | SORT
или сортированые в обратном порядке
tasklist /NH /FI "IMAGENAME eq s*" | SORT /R

Тебе остается FOR или IF прикрутить для обработки всех параметров.

-----
Computer Security Laboratory





Ранг: 106.9 (ветеран), 27thx
Активность: 0.080
Статус: Участник

Создано: 22 сентября 2008 20:31 · Поправил: Oott
· Личное сообщение · #5

Читал, но там формат показан не понятно. И в примерах ниже, ниче похожего небыло. Спасибо за примерчик,всё встало на свои места, дальше я сам разберусь
Добавлено
Задание оказалось не оч сложным.
Вот код, удовлетворяет все условия данного задания:
Code:
  1. @echo off
  2. IF /%1 == //ASC (SET WH=
  3.   SET SJ=/ASC 
  4. ) ELSE (IF /%1== //DESC (SET WH=/R
  5.   SET SJ=/DESC
  6. ) ELSE (
  7.    @echo Error32: 1 parameter incorrect!
  8.     goto :eof))
  9. FOR /%%IN (%*) DO ( IF /%%i NEQ /%SJ% (
  10.   tasklist /NH /FI "IMAGENAME eq %%i*" | SORT%WH%))

P.s. если возможно сделать короче(может используя SHIFT), отпишите.




Ранг: 467.7 (мудрец), 5thx
Активность: 0.270
Статус: Участник
Иной :)

Создано: 23 сентября 2008 10:00 · Поправил: [HEX]
· Личное сообщение · #6

Oott
Параметры пишутся отдельно от имени приложения.
SORT%WH%
так что лучше писать
SORT %WH%

А так вроде все верно.

P.S. Вот цикл проходящий по всем переданым параметрам:
Code:
  1. :loop
  2.         if "%1" == "" ( exit )
  3.         echo %1
  4.         shift
  5. goto :loop


-----
Computer Security Laboratory





Ранг: 106.9 (ветеран), 27thx
Активность: 0.080
Статус: Участник

Создано: 23 сентября 2008 12:07 · Поправил: Oott
· Личное сообщение · #7

[HEX],ОК, спасибо, но на работоспособность это не повлияло.
ДА, вот с этим циклом P.S. Вот цикл проходящий по всем переданым параметрам:, можно обойтись без этого IF:IF /%%i NEQ /%SJ% . Проблема то в чем была, нужно было вывести процессы отсортированные начиная со %2 преданного параметра, пропуская ключ /ASC - «по возрастанию», /DESC - «по убыванию» , который был занесён в %1, в FOR не так просто было это сделать и пришлось пропускать его через прверку в цыкле. А с SHIFT чета не получается, пример:
Code:
  1. IF /%1 == //ASC (SET WH=  
  2. ) ELSE (IF /%1== //DESC (SET WH=/R
  3. ) ELSE ( 
  4.    @echo Error32: 1 parameter incorrect! 
  5.     goto :eof)) 
  6. SHIFT
  7. FOR /%%IN (%*) DO tasklist /NH /FI "IMAGENAME eq %%i*" | SORT %WH%

Там хоть 2 SHIFT'a ставь, всёравно цикл будет проходить начиная с %1 переданного параметра, в этом месте ещё препод чуть запутался и счёл мне отчёт в 10б.




Ранг: 467.7 (мудрец), 5thx
Активность: 0.270
Статус: Участник
Иной :)

Создано: 23 сентября 2008 16:59
· Личное сообщение · #8

Oott
Последний пример вообще непонятен =) Так как там SHIFT будет выполнен 1 раз. Зачем туда его влепил?! Описание по SHIFT читал? В фильтр tasklist попадет ключ/ключи сортировки, что не есть тру!

Я наверное немного задание может не допонимаю У каждой группы может быть свой соответствующий ключ сортировки или его вообще может не быть? Так чтоли? Если так, то вызов может выглядить вот так: prog.bat x /DESC a /ASC t s e /ASC
Если пример вызова верный, то задание слегка усложняется, но не намного.

Вот мой пример решения:
Code:
  1. @echo off
  2. :loop
  3.         SET WH=
  4.         SET SEARCH=%1
  5.         IF "%2" == "/ASC" (SET WH=
  6.                 SHIFT
  7.         ) ELSE (
  8.                 IF "%2" == "/DESC" (
  9.                         SET WH=/R
  10.                         SHIFT
  11.                 )
  12.         )
  13.         IF "%SEARCH%" == "" (
  14.                 echo Bye!
  15.                 exit
  16.         )
  17.          echo ============= Process: name [ %SEARCH% ] ================
  18.         tasklist /NH /FI "IMAGENAME eq %SEARCH%*" | SORT %WH%
  19.          echo ============= END Process: name [ %SEARCH% ] ============
  20.         shift
  21. goto :loop


Впринципе оно соответствует заданию на 95%. Остается вывести сообщение если ничего вообще не найдено. Для этого смотрим результаты работы tasklist и если в процессе всего цикла ничего так и небыло найдено, то и выводим соответствующее сообщение. Думаю это не составит труда добавить?

Если же параметр сортировки общий для всех групп и этот параметр указывается в самом начале, то впринципе еще проще:

Code:
  1. @echo off
  2. SET WH=
  3. IF "%1" == "/ASC" (SET WH=
  4.          SHIFT
  5. ) ELSE (
  6.          IF "%1" == "/DESC" (
  7.                  SET WH=/R
  8.                  SHIFT
  9.          )
  10. )
  11. IF "%1" == "" (
  12.          echo Parameter incorrect. Bye!
  13.          exit
  14. )
  15. :loop
  16.          echo ============= Process: name [ %1 ] ================
  17.         tasklist /NH /FI "IMAGENAME eq %1*" | SORT %WH%
  18.          echo ============= END Process: name [ %1 ] ============
  19.         shift
  20.          IF "%1" == "" exit
  21. goto :loop


-----
Computer Security Laboratory





Ранг: 106.9 (ветеран), 27thx
Активность: 0.080
Статус: Участник

Создано: 23 сентября 2008 22:43
· Личное сообщение · #9

[HEX], Хватит спрашивать читал ли я описание. Читал SHIFT это нечто врде - сдвиг подставляемых параметров. В фильтр tasklist попадет ключ/ключи сортировки, что не есть тру!
Я ж написал,что не получается. По моим доводам параметры должны были сместиться и в фильтр не должен был попасть ключ, если это сделать без цикла, а как ты написал с использованием goto :loop, то всё нормально работает. P.S. задание проще, ключ для всех один.




Ранг: 467.7 (мудрец), 5thx
Активность: 0.270
Статус: Участник
Иной :)

Создано: 24 сентября 2008 00:05
· Личное сообщение · #10

Oott
Виндовый хелп бывает более полно расказывает описание комманды!
Цитирую:
Использование %* с командой shift
Команда shift не влияет на пакетный параметр %*.

Поэтому и сделал вывод что не читал описание комманды shift или читал не полностью

Ну раз задание простое "с одним общим ключем сортировки", то берем второй вариант и шлифуем напильником: вывод результата помещаем в переменную, проверяем в конце цикла есть ли в буфере что то, и если ничего нет, то пишем сообщение о хреновой выборке это в общих чертах...

-----
Computer Security Laboratory



 eXeL@B —› Программирование —› Разборка bat файла
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати