Модераторы: bartram, Akella

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Несколько вопросов по командной строке 
V
    Опции темы
MrDmitry
Дата 26.2.2011, 02:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Всем привет. Появилось несколько вопросов по командной строке
1. Как в cmd написать логическую операцию сравнения? То есть например в нормальных языках программирования можно написать так

Код

if a>=b then  b:=a;


В cmd же если я пишу любые другие символы кроме как == выдается ошибка (( Google не помог.

2. Как я понял в cmd невозможно воспроизводить звук. Но это возможно в vbs. Пришла идея сделать так записать файл vbs

Код

@ECHO Private Declare Function mciExecute Lib "winmm.dll" (ByVal lpstrCommand As String) As Long > beep.vbs
@ECHO Private Sub Form_Click() >> beep.vbs
@ECHO Dim res >> beep.vbs
@ECHO res = mciExecute("Play C:\Путь_до_файла") >> beep.vbs
@ECHO End Sub >> beep.vbs


Но проблема в том что не могу экранировать AS. И если вызвать файл beep.vbs из cmd то скорее всего у нас появится окно, которое будет висеть пока не проиграется файл. От него как нибудь можно избавится? 

3 в скрипте который я написал пользователь может запустить несколько раз один и тот же процесс. Все процессы удаленные, поэтому параметр taskkill /im имя_процесса не подходит. Нужно как то узнать каждый раз при запуски процесса его pid. Думал в начале выводить содержимое tasklist в файл, в файле сортировать нужные мне процессы (процессы всегда отображаются в порядке их включения). Но в cmd как то не удобно работать с файлами и строками. Может быть есть какие нибудь варианты узнавать pid вновь запущенного процесса??
PM MAIL   Вверх
Akina
Дата 26.2.2011, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 42
Всего: 454



1.
Код

IF /?

2. Используй cscript хост.
3. Вот почему нужно использовать батники, когда есть VBS/JS/PS-скрипты? 


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
01MDM
Дата 26.2.2011, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 273
Регистрация: 10.5.2008
Где: Default City

Репутация: 29
Всего: 29



Цитата

Как я понял в cmd невозможно воспроизводить звук

Можно:
Код

@echo off
echo [char] 0x7

Где '[char] 0x7' заменяешь соответстветствующим символом.
Цитата

например в нормальных языках программирования

Это две разные ниши. Иногда удобней накатать пакетный файл со списком команд и примитивными условиями, чем писать отдельную тулзу.


--------------------
Вопросы в личке останутся без ответов.
PM MAIL   Вверх
MrDmitry
Дата 26.2.2011, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Но как раз сейчас мне быстрее и удобнее накатать bat файл чем писать на bat файлах. If с отрицанием нужен всего лишь для удобства. Использование vbs js ps для поставленной задачи не нужны

Это сообщение отредактировал(а) MrDmitry - 26.2.2011, 14:23
PM MAIL   Вверх
mihanik
Дата 26.2.2011, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


-=Белый Медведь=-
****


Профиль
Группа: Комодератор
Сообщений: 4054
Регистрация: 24.4.2006
Где: г. Тверь

Репутация: 61
Всего: 109



MrDmitry!!!

Цитата(MrDmitry @  26.2.2011,  02:24 Найти цитируемый пост)
Declare Function mciExecute Lib "winmm.dll" (ByVal lpstrCommand As String) As Long > beep.vbs


Глупость написали.
В VBS все переменные не типизированы!
VBA или VB6 - да.



--------------------
Программистами не рождаются, - это родовая травма...
user posted imageuser posted image
PM MAIL WWW ICQ   Вверх
MrDmitry
Дата 26.2.2011, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



да я понял, с воспроизведением музыки поступил так

Код

@echo

set basic=basic.vbs
set sound=c:\1.wav

ECHO Set Obj = CreateObject("WScript.Shell") >>%basic%
ECHO.Obj.Run """C:\Program Files\Windows Media Player\wmplayer.exe"" ""%sound%""", 0 >>%basic% 
start %basic%
@ping 127.0.0.1 -n 2 2> nul > nul 
del %basic%
pause


также разобрался с if конструкцией 

Код

if NOT строка1 == строка2 ( )


А вот с pid процесса все не как не могу разобраться. сейчас делаю так

Код

TASKLIST /NH /FI "WINDOWTITLE eq title окна" >>dat.TXT


в итоге получаю файлик только с нужными мне процессами и pid. Причем процессы в файле расположены в точности в порядке их запуска. Но теперь как то нужно удалить все не нужное оставив только имя и pid процесса. А обрабатывать все это дело в bat файле я не знаю как

Это сообщение отредактировал(а) MrDmitry - 26.2.2011, 20:10
PM MAIL   Вверх
01MDM
Дата 26.2.2011, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 273
Регистрация: 10.5.2008
Где: Default City

Репутация: 29
Всего: 29



MrDmitry,
Цитата

да я понял, с воспроизведением музыки поступил так

Я думал нужен beep.

А не проще:
Код

@echo off
start "" "C:\1.wav"

Цитата

Но теперь как то нужно удалить все не нужное оставив только имя и pid процесса.

Код

@echo off
for /f "tokens=1,2" %%i in ('tasklist /nh /fi "windowtitle eq sometitle"') do 1>>dat.txt echo %%i %%j

 


--------------------
Вопросы в личке останутся без ответов.
PM MAIL   Вверх
MrDmitry
Дата 26.2.2011, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Цитата(01MDM @ 26.2.2011,  20:30)
MrDmitry,
Цитата

да я понял, с воспроизведением музыки поступил так

Я думал нужен beep.

А не проще:
Код

@echo off
start "" "C:\1.wav"

Цитата

Но теперь как то нужно удалить все не нужное оставив только имя и pid процесса.

Код

@echo off
for /f "tokens=1,2" %%i in ('tasklist /nh /fi "windowtitle eq sometitle"') do 1>>dat.txt echo %%i %%j

@echo off
start "" "C:\1.wav"
не проще, так открывается проигрыватель и воспроизводит файл. А мой способ просто воспроизводит звук файл без всяких видимых окон.

за код спасибо
PM MAIL   Вверх
MrDmitry
Дата 27.2.2011, 03:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



возник еще вопросик

код 
Код

for /f "tokens=1,2" %%i in ('tasklist /nh /fi "windowtitle eq sometitle"') do 1>>dat.txt echo %%i %%j

хорошо работает. А как можно изменить определенную строку, удалить, или записать в переменную? Нужная строка заранее известна. Пробовал конструкцию 

Код

@Echo off
for /F "tokens=*" %%i IN (dat.txt) DO (
set /a n=n+1
if "%n%"=="3" (
echo %i%
)
)
pause


Но она не работает ((
PM MAIL   Вверх
01MDM
Дата 27.2.2011, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 273
Регистрация: 10.5.2008
Где: Default City

Репутация: 29
Всего: 29



MrDmitry, 
Если ты все хочешь сделать в теле цикла, и устанавливаешь переменные и сразу к ним обращаешься, то необходимо включить отложенное расширение переменной среды. В твоем примере:
Код

@echo off
setlocal enabledelayedexpansion

for /f "tokens=*" %%i in (dat.txt) do (

    set /a n+=1
    if !n! equ 3 echo %%i

)
1>nul pause


Если надо взять только третью строку, то можно так:
Код

@echo off

for /f "skip=2 tokens=*" %%i in (dat.txt) do echo %%i && goto:next

:next
pause 1>nul



--------------------
Вопросы в личке останутся без ответов.
PM MAIL   Вверх
MrDmitry
Дата 28.2.2011, 03:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



У меня еще один самый последний вопрос и мой скрипт будет готов ))

Собственно есть файл структуры

Код

1 27022 1111
2 27023 3333
3 27024 6666
4 27025 2323



Удаляю третью строку

Код

type dat.txt | findstr /i /v "3" > temp.txt
del dat.txt
rename temp.txt dat.txt


Остается


Код

1 27022 1111
2 27023 3333
4 27025 2323 


Теперь мне нужно добавить еще одну строку но чтоб нумерация продолжилась со второго столца

Код

1 27022 1111
2 27023 3333
3 27025 2323 
4 27026 8768


Попробовал сделать так

Код

setlocal enabledelayedexpansion
for /f "tokens=*" %%i in (dat.txt) do  set /a abc+=1
for /f "tokens=2" %%i in (dat.txt) do (
    set /a ka+=1
    if !ka! equ %abc% set count_two=%%i
    ) 

set count=0
FOR /F "TOKENS=*" %%A IN (dat.txt) DO CALL :_SOMELABEL %%A 
GOTO :END 
 
:_SOMELABEL 
SET /a count_two+=1
SET /a count+=1 
ECHO %count% %count_two% %*>>dat.txt
:END


Мой способ начинает нумеровать с начало. То есть получаем

Код

1 27022 1111
2 27023 3333
3 27024 2323 
4 27025 8768


А как сделать как мне нужно? Чтоб нумерация продолжала записываться в файл с последнего значения второго столбца?
PM MAIL   Вверх
01MDM
Дата 28.2.2011, 07:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 273
Регистрация: 10.5.2008
Где: Default City

Репутация: 29
Всего: 29



MrDmitry,

Цитата

Собственно есть файл структуры
Код
    
1 27022 1111
2 27023 3333
3 27024 6666
4 27025 2323


Код

@echo off
setlocal enabledelayedexpansion

:: Удаляем третью строчку и перезаписываем файл с новой нумерацией

for /f "tokens=1-3" %%i in (dat.txt) do (
     
     set /a cnt+=1
     if not %%i equ 3 (1>>temp.dat echo !cnt! %%j %%k) else (set /a cnt-=1)

)

move temp.dat dat.txt

Как дописывать, по какому принципу, из какого источника, я не понял. 



--------------------
Вопросы в личке останутся без ответов.
PM MAIL   Вверх
MrDmitry
Дата 28.2.2011, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Ну смотри. Я получаю список запущенных процессов по имени окна

Код

аor /f "tokens=1,2" %%i in ('tasklist /nh /fi "windowtitle eq titile"') do 1>>dat1.txt echo %%j
CALL :SERVWRITE


Затем формирую список

Код

номер   порт    pid
1          28024   989
2          28025   745
3          28026   3245


то есть беру pid из файла dat1.txt и нумерую его
Код

REM ЗАПИСЫВАЕМ ПОРТ И PID СЕРВЕРА
:SERVWRITE
DEL dat.txt
set counts=27023
set count=0
FOR /F "TOKENS=*" %%A IN (dat1.txt) DO CALL :_SOMELABEL %%A 
GOTO :END 
  
:_SOMELABEL 
SET /a counts_serv+=1
SET /a count+=1 
ECHO %count% %counts_serv% %*>>dat.txt
if exist dat1.txt del dat1.txt

:END


Теперь предположим я уничтожаю процесс 2 с pid 745

Код

:Run1
setlocal enabledelayedexpansion
for /f "tokens=3" %%i in (dat.txt) do (
    set /a k+=1
    if !k! equ %answer_off% (
    taskkill /pid %%i
    type hlds.txt | findstr /i /v "%%i" > temp.txt
del hlds.txt
rename temp.txt dat.txt
    )
)


Получается что в файле остается 

Код

номер   порт    pid
1          28024   989
3          28026   3245


А через некоторое время я запускаю новый процесс с новым портом

Код

set /a sum_port+=1
start crash.exe -port %sum_port%
@ping 127.0.0.1 -n 2 2> nul > nul
for /f "tokens=1,2" %%i in ('tasklist /nh /fi "windowtitle eq titile"') do 1>>dat1.txt echo %%j


И нужно чтоб получился файлик 

Код

номер   порт    pid
1          28024   989
2          28026   3245
3          28077   3524

Как я пытаюсь осуществить писал выше, но мой способ начинает нумерацию заново (((((

Вывожу список для уничтожения процесса так 


Код

if "%answer%" == "3" (
cls
ECHO.
ECHO Выберите порт для отключения
setlocal enabledelayedexpansion
for /f "tokens=1,2" %%i in (dat.txt) do (
    set /a n+=1
    echo %%i %%j
)
Echo 0. Выход
set /p answer_off=Сделайте ваш выбор:
call :Run1
)


Если банально, то все эти манипуляции я делаю для того чтобы узнать pid выбранного процесса и его уничтожить. Может быть есть и более легкий способ осуществить мою затею, но мне в голову пришел только такой вариант

Это сообщение отредактировал(а) MrDmitry - 28.2.2011, 12:37
PM MAIL   Вверх
01MDM
Дата 28.2.2011, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 273
Регистрация: 10.5.2008
Где: Default City

Репутация: 29
Всего: 29



MrDmitry,
А откуда берется порт?
Вот, как пример, вариант с калькуляторами без файла-списка. Сначала запускаем:
Код

C:\> for /l %i in (1,1,9) do start calc

Сам батник:
Код

@echo off
setlocal
1>nul chcp 1251

echo #  PID
echo - -----

for /f "tokens=2" %%i in (' tasklist /nh /fi "windowtitle eq Калькулятор" ') do call:set %%i

for /f "tokens=2,3 delims=_=" %%i in (' set apps_ ') do echo %%i  %%j
echo -----
set /p choice="Завершить процесс (по номеру): "

for /f "tokens=2 delims==" %%i in (' set apps_%choice% ') do taskkill /pid %%i
goto:eof

:set
set /a cnt+=1
set "apps_%cnt%=%1"



--------------------
Вопросы в личке останутся без ответов.
PM MAIL   Вверх
MrDmitry
Дата 1.3.2011, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



вот так берется порт

Код

if "%answer%" == "1" (
cls
set /a sum_port=sum_port + 1
start crash.exe -port %sum_port%
)


то есть при каждом запуске порт увеличивается на 1


Твой пример с калькулятором у меня не работает (

PM MAIL   Вверх
01MDM
Дата 1.3.2011, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 273
Регистрация: 10.5.2008
Где: Default City

Репутация: 29
Всего: 29



MrDmitry, 
Цитата

Твой пример с калькулятором у меня не работает (

Ну не знаю. У меня все работает
user posted image

PS. Может у тебя батник не OEM-кодировке ( 866 ) и не понимает заголовок? Тогда убери `1>nul chcp 1251` 

Чтоб избежать проблем с заголовком окна, если знаешь название исполняемого файла, то можно с помощью findstr:
Код

for /f "tokens=2" %%i in (' tasklist ^| findstr "crash.exe" ') do echo %%i


Это сообщение отредактировал(а) 01MDM - 1.3.2011, 19:30


--------------------
Вопросы в личке останутся без ответов.
PM MAIL   Вверх
MrDmitry
Дата 1.3.2011, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Это интересно, но как люди которые будут пользоваться скриптом, будут понимать какой pid к какому экземпляру запущенной программы относится? Вообщем как сделать в твоем примере чтоб нумерация шла по порядку и за место pid нумерация с определенного числа

Это сообщение отредактировал(а) MrDmitry - 1.3.2011, 23:51
PM MAIL   Вверх
01MDM
Дата 2.3.2011, 07:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 273
Регистрация: 10.5.2008
Где: Default City

Репутация: 29
Всего: 29



MrDmitry, 
Тогда без записи действительно не обойтись. Вот наколенник, не проверял, спешу на работу:

Код

@echo off
setlocal enabledelayedexpansion


:: Если нет файла dat.txt начинаем с порта 20000

if not exist dat.txt (

    start calc
    for /f "tokens=2" %%i in (' tasklist ^| findstr "crash.exe" ') do 1>dat.txt echo 1 20000 %%i

)

:: Меню выбора

set "choice=0"

echo [0] Exit
echo [1] Start new process
echo [2] Kill process
echo [3] Kill all
echo --------- 
set /p choice="Choose: "

if %choice% equ 0 goto:eof
if %choice% equ 1 goto:start
if %choice% equ 2 goto:kill
if %choice% equ 3 (

    1>nul taskkill /im crash.exe
    del dat.txt

)
goto:eof

:: Запускаем новый процесс и перезаписываем файл dat.txt

:start

for /f "tokens=2" %%i in (dat.txt) do (

    set /a port=%%i+1
    set /a cnt+=1

)

start crash.exe
for /f "tokens=2" %%i in (' tasklist ^| findstr "crash.exe" ') do 1>>dat.txt echo %cnt% %port% %%i
goto:eof

:: Убиваем процесс на выбор и перезаписываем dat.txt

:kill

set "choice=1"

echo.
type dat.txt
set /p choice="Enter number to kill (default 1): "

for /f "tokens=3" %%i in (' findstr /b "%choice%" dat.txt ') do 1>nul taskkill /pid %%i

for /f "tokens=3" %%i in (' findstr /b "%choice%" dat.txt ') do (

    1>nul taskkill /pid %%i
    for /f "tokens=2,3" %%j in (' findstr /v "%%i" dat.txt ') do (

        set /a cnt+=1
        1>>dat.tmp echo !cnt! %%j %%k

))

move dat.tmp dat.txt


Это сообщение отредактировал(а) 01MDM - 2.3.2011, 20:32


--------------------
Вопросы в личке останутся без ответов.
PM MAIL   Вверх
MrDmitry
Дата 2.3.2011, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Твой вариант прекрасно работает с калькулятором. Но не работает с моим примером.

Код

@echo off
set sum_port=27015

setlocal enabledelayedexpansion
if not exist dat.txt (
    set /a sum_port=sum_port + 1
    start crash.exe +port %sum_port%
    for /f "tokens=2" %%i in (' tasklist ^| findstr "crash.exe" ') do 1>dat.txt echo 1 %sum_port% %%i
)

:: Меню выбора
:Menu
set "choice=0"
echo [0] Exit
echo [1] Start new process
echo [2] Kill process
echo --------- 
set /p choice="Choose: "
if %choice% equ 0 goto:eof
if %choice% equ 1 goto:start
if %choice% equ 2 goto:kill

:: Запускаем новый процесс и перезаписываем файл dat.txt
:start
for /f "tokens=2" %%i in (dat.txt) do (
    set /a port=%%i+1
    set /a cnt+=1
)
start crash.exe +port %port%
for /f "tokens=2" %%i in (' tasklist ^| findstr "crash.exe" ') do 1>>dat.txt echo %cnt% %port% %%i
goto:Menu

:: Убиваем процесс на выбор и перезаписываем dat.txt
:kill
set "choice=1"
echo.
type dat.txt
set /p choice="Enter number to kill (default 1): "
for /f "tokens=3" %%i in (' findstr /b "%choice%" dat.txt ') do 1>nul taskkill /pid %%i
for /f "tokens=2,3" %%i in (dat.txt) do (
    set /a cnt+=1
    1>>dat.tmp echo !cnt! %%i %%j
)
move dat.tmp dat.txt


Результат

Код

1 27015 4596
1 27016 4596
1 27016 4796
4 27017 4596
4 27017 4796
4 27017 4916
10 27018 4596
10 27018 4796
10 27018 4916
10 27018 5056


Такой результат выдался после трех запусков программы crash.exe из скрипта
PM MAIL   Вверх
01MDM
Дата 2.3.2011, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 273
Регистрация: 10.5.2008
Где: Default City

Репутация: 29
Всего: 29



Спешил, немного исправил в предыдущем листинге


--------------------
Вопросы в личке останутся без ответов.
PM MAIL   Вверх
MrDmitry
Дата 3.3.2011, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Код

1 20000 2536
1 20001 2536
1 20001 764
4 20002 2536
4 20002 764
4 20002 3048
10 20003 2536
10 20003 764
10 20003 3048
10 20003 1200


Вот что записывается в файл dat.txt 
Это я только запускаю экземпляры программы

Это сообщение отредактировал(а) MrDmitry - 3.3.2011, 15:46
PM MAIL   Вверх
01MDM
Дата 3.3.2011, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 273
Регистрация: 10.5.2008
Где: Default City

Репутация: 29
Всего: 29




Попробуй такой вариант. С калькуляторами работает =)

Код

@echo off
setlocal enabledelayedexpansion


:: Если нет файла dat.txt начинаем с порта 20000

if not exist dat.txt (

    start crash -port 20000
    for /f "tokens=2" %%i in (' tasklist ^| findstr "crash.exe" ') do 1>dat.txt echo 1 20000 %%i

)

:: Меню выбора

set "choice=0"

echo [0] Exit
echo [1] Start new process
echo [2] Kill process
echo [3] Kill all
echo --------- 
set /p choice="Choose: "

if %choice% equ 0 goto:eof
if %choice% equ 1 goto:start
if %choice% equ 2 goto:kill
if %choice% equ 3 (

    1>nul taskkill /im crash.exe
    del dat.txt

)
goto:eof

:: Запускаем новый процесс и перезаписываем файл dat.txt

:start
for /f "tokens=2" %%i in (dat.txt) do set /a port=%%i+1

start crash -port %port%

for /f "tokens=1,3" %%i in (dat.txt) do (
    
    set /a num=%%i+1
    for /f "tokens=2" %%k in (' tasklist ^| findstr "crash.exe" ') do (
        
        if "%%j"=="%%k" (set "pid=") else (set "pid=%%k") 
    
    )
    
)

1>>dat.txt echo %num% %port% %pid%

goto:eof

:: Убиваем процесс на выбор и перезаписываем dat.txt

:kill

1>nul findstr /b "\<2\>" dat.txt || (
    
    1>nul taskkill /im crash.exe
    del dat.txt
    goto:eof

)

set "choice=1"

echo.
for /f "tokens=1-3" %%i in (dat.txt) do echo [%%i] %%j %%k
echo -----
set /p choice="Enter number to kill (default 1): "

for /f "tokens=3" %%i in (' findstr /b "%choice%" dat.txt ') do (

    1>nul taskkill /pid %%i
    for /f "tokens=2,3" %%j in (' findstr /v "%%i" dat.txt ') do (

        set /a cnt+=1
        1>>dat.tmp echo !cnt! %%j %%k

))

move dat.tmp dat.txt


Это сообщение отредактировал(а) 01MDM - 3.3.2011, 21:14


--------------------
Вопросы в личке останутся без ответов.
PM MAIL   Вверх
MrDmitry
Дата 4.3.2011, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



01MDM Огромное спасибо. Кое что подправил под себя и теперь все работает как часы! 
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Windows"
December
bartram
Akella

Запрещается!

1. Обсуждать взлом и делиться кряками

2. Способствовать созданию и распространению вирусов

  • Для бессмертных бородатых вопросов типа Win vs Nix есть специальный форум Религиозные Войны
  • Несанкционированная реклама на форуме запрещена
  • Пожалуйста, давайте своим темам осмысленный, информативный заголовок. Вопль "Помогите!" таковым не является.
  • Чем полнее и яснее Вы изложите проблему, тем быстрее мы её решим.
  • ВСЕГДА УКАЗЫВАЙТЕ ВЕРСИЮ ОС

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, December, bartram, Akella.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS Windows | Следующая тема »


 




[ Время генерации скрипта: 0.1083 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.