Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   закрыть определенное количество калькуляторов, а не все сразу (http://forum.oszone.net/showthread.php?t=336716)

Khmel_19 16-09-2018 16:59 2831600

закрыть определенное количество калькуляторов, а не все сразу
 
пытаюсь сделать лабу.. универ.. Создать файл 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 2831612

Khmel_19, убивайте по PID

Khmel_19 16-09-2018 18:52 2831623

sov44, так фишка в том, что хоть 100 калькуляторов будет запущено, pid будет "одинаковый и общий" для всех

sov44 16-09-2018 19:12 2831630

Цитата:

Цитата Khmel_19
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 2831640

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

Iska 16-09-2018 20:18 2831650

Цитата:

Цитата Khmel_19
На вход пакетному файлу приходит число ( N ) (как параметр пакетного файла). »

Не вижу в Вашем пакетном файле попыток использования его параметров, вижу попытку использования запроса к пользователю:
Цитата:

Цитата Khmel_19
set /p p=N= »

Цитата:

Цитата Khmel_19
затем закрываются все запущенные калькуляторы, кроме одного. »

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

Предположим, пусть это будет последний запущенный:
Код:

@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 2831652

Iska, мало что понял из выше написанного, но точно понял что это не работает.sov44, у меня 10 винда, поэтому pid не подходит

Iska 16-09-2018 21:12 2831662

Цитата:

Цитата Khmel_19
Iska, мало что понял из выше написанного, но точно понял что это не работает. »

«Это» работает. Если я выкладываю код, который предварительно не проверил на работоспособность, то я об этом специально уведомляю. Но здесь не тот случай.

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

Цитата:

Цитата Khmel_19
sov44, у меня 10 винда, поэтому pid не подходит »

Это Вы о чём? PID он везде PID, от Windows 1.01 до Windows 10.

Khmel_19 16-09-2018 22:50 2831678

Цитата:

Цитата Khmel_19
Создать файл bat который выполняет следующее: На вход пакетному файлу приходит число ( N ) (как параметр пакетного файла). Открывается N калькуляторов (программно), затем закрываются все запущенные калькуляторы, кроме одного. - мое задание. »

Iska, Ваш код не выполняет поставленное мне условие. Буду очень рад если вы напишите тот, который выполнит) и еще раз спасибо

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

Iska 16-09-2018 23:31 2831685

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. Через один пробел параметром пакетного файла указываете будущее количество экземпляров запущенного приложения, то самое Ваше:
Цитата:

Цитата Khmel_19
На вход пакетному файлу приходит число ( N ) (как параметр пакетного файла). »



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

6. В окне консоли командной строки нажимаете Enter, запуская пакетный файл на исполнение, и видите примерно такую картину:
Скрытый текст

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



7. В окне консоли командной строки нажимаете для продолжения на любую клавишу и видите примерно такую картину:
Скрытый текст

Первые четыре Блокнота из запущенных пакетным файлом принудительно были закрыты, остался только один последний Блокнот. Тот Блокнот, в котором мы создавали и сохраняли наш пакетный файл, тоже остался открытым, т.е., никак не был затронут работой пакетного файла (как и должно быть по уму).

Khmel_19 17-09-2018 17:03 2831778

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

Iska 17-09-2018 17:19 2831783

Цитата:

Цитата Khmel_19
не знаю есть ли смысл снова просить вас о помощи »

Меня — нет, я не большой знаток Linux.

Возможно, в соответствующем разделе: Программирование в *nix подскажут быстрее.

Khmel_19 17-09-2018 18:14 2831796

Iska, огромное спасибо!


Время: 11:16.

Время: 11:16.
© OSzone.net 2001-