Войти

Показать полную графическую версию : закрыть определенное количество калькуляторов, а не все сразу


Khmel_19
16-09-2018, 16:59
пытаюсь сделать лабу.. универ.. Создать файл bat который выполняет следующее: На вход пакетному файлу приходит число ( N ) (как параметр пакетного файла). Открывается N калькуляторов (программно), затем закрываются все запущенные калькуляторы, кроме одного. - мое задание. вот мой код
@echo off
cd c:\windows\system32
set /p p=N=
for /l %%a in (1,1,%p%) do start " " calc.exe && timeout /t 1 && cls
set /a i=%p%-1
for /l %%b in (1,1,%i%) do taskkill /f /im Calculator.exe && timeout /t 1 && cls
pause
первая половина работает отлично, т.е открывается введенное мной число калькуляторов, но закрываются все, а мне нужно чтобы закрылись все, кроме одного. Думаю проблема в команде taskkill, пробовал exit, тож не робит(
Спасибо заранее.

sov44
16-09-2018, 18:17
Khmel_19, убивайте по PID

Khmel_19
16-09-2018, 18:52
sov44, так фишка в том, что хоть 100 калькуляторов будет запущено, pid будет "одинаковый и общий" для всех

sov44
16-09-2018, 19:12
pid будет "одинаковый и общий" для всех »
PID не будет одинаков для всех, смотрите tasklist

Khmel_19, например так
@echo off
SetLocal EnableDelayedExpansion

set /p p=N=
for /l %%a in (1,1,%p%) do start "" calc.exe
timeout /t 8
for /f "tokens=1-2 delims= " %%b in ('tasklist ^|find /i "calc.exe"') do (
if !p! GTR 1 >nul taskkill /FI "PID eq %%c"
set /a p-=1
)
pause

Khmel_19
16-09-2018, 19:43
sov44, C:\Users\я>tasklist | find /i "calculator.exe"
Calculator.exe 7604 Console 3 57*784 КБ при запущенных 2ух калькуляторах, код не робит, ну или я его не так использую. Мою задачу он не решает, но спасибо)

Iska
16-09-2018, 20:18
На вход пакетному файлу приходит число ( N ) (как параметр пакетного файла). »
Не вижу в Вашем пакетном файле попыток использования его параметров, вижу попытку использования запроса к пользователю:
set /p p=N= »

затем закрываются все запущенные калькуляторы, кроме одного. »
Каким образом должен выбираться этот Дункан МакЛауд среди прочих калькуляторов?

Предположим, пусть это будет последний запущенный:
@echo off
setlocal enableextensions enabledelayedexpansion

set iCount=%~1

if defined iCount (
for /l %%i in (1, 1, %iCount%) do (
for /f "usebackq delims=" %%j in (`wmic.exe Process call Create "calc.exe" ^| find.exe /i "ProcessId"`) do for /f "tokens=2 delims==; " %%k in ("%%j") do (
set sProcessID%%i=%%~k
)
)

set sProcessID
pause

set /a iCount -= 1

for /l %%i in (1, 1, !iCount!) do (
>nul wmic.exe Process where "ProcessID='!sProcessID%%i!'" call Terminate 0
)
) else (
echo Usage: %~nx0 ^<Count^>
exit /b 1
)

endlocal
exit /b 0

Khmel_19
16-09-2018, 20:36
Iska, мало что понял из выше написанного, но точно понял что это не работает.sov44, у меня 10 винда, поэтому pid не подходит

Iska
16-09-2018, 21:12
Iska, мало что понял из выше написанного, но точно понял что это не работает. »
«Это» работает. Если я выкладываю код, который предварительно не проверил на работоспособность, то я об этом специально уведомляю. Но здесь не тот случай.

Или, может быть, Вы не знаете, что такое «параметр пакетного файла» и как его задавать?

sov44, у меня 10 винда, поэтому pid не подходит »
Это Вы о чём? PID он везде PID, от Windows 1.01 до Windows 10.

Khmel_19
16-09-2018, 22:50
Создать файл bat который выполняет следующее: На вход пакетному файлу приходит число ( N ) (как параметр пакетного файла). Открывается N калькуляторов (программно), затем закрываются все запущенные калькуляторы, кроме одного. - мое задание. » Iska, Ваш код не выполняет поставленное мне условие. Буду очень рад если вы напишите тот, который выполнит) и еще раз спасибо

Iska, прошу использовать не калькуляторы а блакноты

Iska
16-09-2018, 23:31
Khmel_19, хорошо.

1. Копируете в буфер обмена следующий код:
@echo off
setlocal enableextensions enabledelayedexpansion

set iCount=%~1
set sProcessName=notepad.exe

if defined iCount (
for /l %%i in (1, 1, %iCount%) do (
for /f "usebackq delims=" %%j in (`wmic.exe Process call Create "%sProcessName%" ^| find.exe /i "ProcessId"`) do for /f "tokens=2 delims==; " %%k in ("%%j") do (
set sProcessID%%i=%%~k
)
)

set sProcessID
pause

set /a iCount -= 1

for /l %%i in (1, 1, !iCount!) do (
>nul wmic.exe Process where "ProcessID='!sProcessID%%i!'" call Terminate 0
)
) else (
echo Usage: %~nx0 ^<Count^>
exit /b 1
)

endlocal
exit /b 0

2. Открываете Блокнот, вставляете в него из буфера обмена ранее скопированный код, сохраняете в файле с расширением .cmd. Сам этот Блокнот можете даже не закрывать — послужит для иллюстрации.

3. Открываете окно командной строки (Win-R, cmd.exe, Enter).

4. Пишете в нём полный путь к сохранённому пакетному файлу (можно просто перетянуть пакетный файл в окно командной строки из Проводника).

5. Через один пробел параметром пакетного файла указываете будущее количество экземпляров запущенного приложения, то самое Ваше:
На вход пакетному файлу приходит число ( N ) (как параметр пакетного файла). »

https://i.imgur.com/GvdPagp.png

В данном примере путь к пакетному файлу — «C:\Мои проекты\0198\0001.cmd», количество экземпляров, указанное первым и единственным параметром пакетного файла — «5».

6. В окне консоли командной строки нажимаете Enter, запуская пакетный файл на исполнение, и видите примерно такую картину:
https://i.imgur.com/YhpFO19.png
Запущено пять новых экземпляров Блокнота, в окне консоли командной строки перечислены идентификаторы их процессов (у Вас они будут, разумеется, свои). Вы можете посмотреть в Диспетчер задач или Process Explorer и убедиться, что их пять, что перечислены именно их идентификаторы, что шестой процесс Блокнота — это тот незакрытый Блокнот, в котором мы создавали и сохраняли наш пакетный файл (это видно по заголовку окна):

https://i.imgur.com/fsWWY49.png

7. В окне консоли командной строки нажимаете для продолжения на любую клавишу и видите примерно такую картину:
https://i.imgur.com/5fdmfe0.png
Первые четыре Блокнота из запущенных пакетным файлом принудительно были закрыты, остался только один последний Блокнот. Тот Блокнот, в котором мы создавали и сохраняли наш пакетный файл, тоже остался открытым, т.е., никак не был затронут работой пакетного файла (как и должно быть по уму).

Khmel_19
17-09-2018, 17:03
Iska, Боже, даже не знаю как вас отблагодарить. Все работает, но мне нужно тоже самое в консоли линукс, я скачал git (эмулятор), не знаю есть ли смысл снова просить вас о помощи, после того что вы для меня сделали, но если есть время и желание, то прощу сделать то же самое и в консоли линукс)

Iska
17-09-2018, 17:19
не знаю есть ли смысл снова просить вас о помощи »
Меня — нет, я не большой знаток Linux.

Возможно, в соответствующем разделе: Программирование в *nix (http://forum.oszone.net/forum-35.html) подскажут быстрее.

Khmel_19
17-09-2018, 18:14
Iska, огромное спасибо!




© OSzone.net 2001-2012