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

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

Ответить
Настройки темы
CMD/BAT - закрыть определенное количество калькуляторов, а не все сразу

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


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

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


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

Отправлено: 16:59, 16-09-2018

 

Ветеран


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

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


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

Отправлено: 18:17, 16-09-2018 | #2



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


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


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

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


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

Отправлено: 18:52, 16-09-2018 | #3


Ветеран


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

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


Цитата 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
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:12, 16-09-2018 | #4


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


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

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


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

Отправлено: 19:43, 16-09-2018 | #5


Ветеран


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

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


Цитата 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
Это сообщение посчитали полезным следующие участники:

Отправлено: 20:18, 16-09-2018 | #6


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


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

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


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

Отправлено: 20:36, 16-09-2018 | #7


Ветеран


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

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


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

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

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

Отправлено: 21:12, 16-09-2018 | #8


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


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

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


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

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

Отправлено: 22:50, 16-09-2018 | #9


Ветеран


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

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


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. В окне консоли командной строки нажимаете для продолжения на любую клавишу и видите примерно такую картину:
Скрытый текст

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

Отправлено: 23:31, 16-09-2018 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - Как скопировать определенное количество строк? sepembra Microsoft Office (Word, Excel, Outlook и т.д.) 1 19-09-2017 13:23
CMD/BAT - [решено] Запуск .bat определенное количество раз и определенное количество дней 55kadi Скриптовые языки администрирования Windows 24 25-10-2016 07:06
Прочее - как задать определенное количество хостов с одного роутера Cisco Dimchik Сетевые технологии 2 21-05-2012 11:54
Вопрос - как сразу закрыть все "дыры" при установке Win2003 server standart? uhuh Защита компьютерных систем 1 09-04-2009 15:46
CMD/BAT - Как закрыть окно bat (пакетного) файла сразу после запуска? Fuzzy_Logic Скриптовые языки администрирования Windows 1 05-11-2006 01:48




 
Переход