Показать полную графическую версию : [решено] Поиск и ожидание закрытия, уже запущенного процесса
Logonius
22-08-2020, 09:11
Всем привет,
Помогите написать батник или может как то по другому. в Общем.
Нужно, чтоб, при запуске батника, он нашел уже запущенный процесс *****.exe и ждал его завершения, в течении дня, как пользователь попользуется. не важно, главное чтоб ждал, после как процесс завершится, должна выполнится команда
удаление папки, там, куда будет помещен батник
@for /f "tokens=1 delims=" %%D in ('dir /ad /b /s "Какая то папка или файл"') do rd /q /s "%%D"
у меня есть один код,
нашел на просторах инета,
set process=какаято-прога.exe
:check
tasklist /FI "IMAGENAME eq %process%" /NH | findstr /i "%process%">nul
if %errorLevel% == 0 goto :check
@for /f "tokens=1 delims=" %%D in ('dir /ad /b /s "Data"') do rd /q /s "%%D"
pause
но он грузит Проц 5-10% что не допустимо, комп должен быть не нагружен вообще. Как такое реализовать.
он нашел уже запущенный процесс »
А если не нашёл — тогда что?
Logonius
22-08-2020, 12:39
А если не нашёл — тогда что? »
так не будет, батник будет запускаться после основного файла следом.
param(
$app = 'calc',
$del = 'name'
)cls
if(ps $app){
while(ps $app){sleep 1}
ri "$PSScriptRoot\$del" -rec
}
else{"$app not launched yet."}
Logonius
22-08-2020, 12:55
Fors1k,
я дико извиняюсь, но я не але ваще=), ваш код не работает у меня, я наверное не так что-то делаю, тыкаю, и тишина), если можно для дурачков объяснить
Uragan66
22-08-2020, 13:33
Logonius, это скрипт powershell.
В значении переменной $app прописываете процесс, который нужно контролировать, в переменную $del - папку, которую нужно удалять.
Logonius
22-08-2020, 13:55
Uragan66,
куда вписывать я понял, но он не как не хочется запускаться, запускал повершелл в папке с прогой где скрипт лежит, вообще не реагирует или ошибки ползут, (не распознан как имя командлета и там бла бла еще че то там.).
но мне такой способ не подходит, надо cmd либо vbs, powershell не как не запустить, так как приложение будет стартовать следом за основным файлом и следить когда он завершиться, а после удалит файл.
Logonius
22-08-2020, 14:33
Запустить удалось, погуглил =), но программа не умеет запускать его в повершел, а запускает в блокноте просто) и прописывал даже powershell -command .\test.ps1, все равно в блокноте, нужен такой же вариант только в cmd-bat-vbs
Uragan66
22-08-2020, 15:38
Logonius, впишите в представленный код актуальные значения переменных, сохраните как test.ps1
Рядом создайте батник с любым именем и таким кодом:
@echo off
SetLocal EnableExtensions
set "ps=" & for %%X in (powerShell.exe) do set "ps=%%~$PATH:X"
if not defined ps set "ps=%systemRoot%\system32\windowsPowerShell\v1.0\powerShell.exe"
For /F "UseBackQ delims=" %%a in (`"cmd /c "
"%ps%" -ExecutionPolicy ByPass -NoProfile -command "./test.ps1"
""`) do (
echo %%a
)
exit /b
Запускайте скрипт PS этим батником.
Logonius
22-08-2020, 16:26
Uragan66, шикарно, огромное спасибо, работает, а можно батник в exe конвертировать?, будет работать, просто мне надо чтоб он тихо в фоне включался, а так CMD окно вылазит.
Uragan66
22-08-2020, 16:44
можно батник в exe конвертировать? »
Logonius, можно сразу и скрипт PS компилировать в исполняемый файл, но нужны точные значения переменных $app и $del
Выложите здесь код с Вашими переменными
Uragan66
22-08-2020, 17:01
Logonius, пробуйте исп. файл. Рядом нужно положить test.ps1
Logonius
22-08-2020, 17:03
Uragan66,
param(
$app = 'Spotify',
$del = 'Data'
)cls
if(ps $app){
while(ps $app){sleep 1}
ri "$PSScriptRoot\$del" -rec
}
else{"$app not launched yet."}
run_proc.zip
(201.8 Kb, 0 просмотров) »
архив поврежден, пишет ошибка контрольной суммы
Uragan66
22-08-2020, 17:24
архив поврежден, пишет ошибка контрольной суммы »
странно... попробовал скачать - нормально архив открывается. Перекачайте другим браузером...
Вот ещё скомпилированный скрипт PS, без батника.
Logonius
22-08-2020, 17:41
Вот ещё скомпилированный скрипт PS, без батника. »
работает, че та делает вроде)), при закрытии проги, потом он следом исчезает и все, а папку не удалил за собой. ЭХ)), 3 дня мучаюсь, вроде задача простая, а так сложно реализовать.
megaloman
22-08-2020, 17:45
NameExe = "notepad.exe" 'Здесь прописать имя процесса
NameDel = "Какая то папка или файл" 'Здесь прописать имя папки или файла
WaitMsec = 5000 'Здесь прописать периодичность опроса наличия процесса милисек.
Do
WScript.Sleep WaitMsec
Set WMI = GetObject("winMgmts:").ExecQuery("SELECT * From Win32_Process WHERE Name='" + NameExe + "'")
If WMI.Count = 0 Then
FScript = WScript.ScriptFullName
With CreateObject("Scripting.FileSystemObject")
PNameDel = .GetParentFolderName(FScript) + "\" + NameDel
If .FolderExists(PNameDel) Then .DeleteFolder PNameDel, True
If .FileExists(PNameDel) Then .DeleteFile PNameDel, True
End With
Exit Do
End If
Loop
Сохранить в кодировке 1251 в .vbs файл, например, kuku.vbs
Запускать как wscript.exe kuku.vbs
Чтобы не грузился зря процессор, периодичность опроса делайте разумной, не слишком маленькой
Logonius
22-08-2020, 17:51
megaloman, От души, дружище, работает как надо, благодарю []~( ̄▽ ̄)~*
megaloman
23-08-2020, 10:50
Logonius, По видимому, моё решение прямолинейно: Вы сформулировали, как Вы хотите решить задачу, я тупо написал решение. Но, вчитываясь в Ваши посты:батник будет запускаться после основного файла следом.
........................
работает, а можно батник в exe конвертировать?, будет работать, просто мне надо чтоб он тихо в фоне включался, а так CMD окно вылазит. », делаю вывод, что ваша основная программа запускается неким командным файлом. И, чтобы убить папку после её отработки, вовсе не надо дополнительно анализировать, есть она в процессах, или нет. Надо просто дождаться окончания программы стандартным образом, то есть, в CMD запустить ее через Start /Wait (сохранить в 866 кодировке)@Echo Off
Set "NameExe=C:\Windows\System32\notepad.exe" 'Здесь прописать путь к программе
Set "NameDel=Какая то папка или файл" 'Здесь прописать имя папки или файла
Start /Wait " " "%NameExe%"
2>nul Rd /S /Q "%NameDel%"
2>nul Del "%NameDel%"
Exit /B
А чтобы не напрягало CMD-окно, вот VBS вариант (сохранить в 1251 кодировке)NameExe = "C:\Windows\System32\notepad.exe" 'Здесь прописать путь к программе
NameDel = "Какая то папка или файл" 'Здесь прописать имя папки или файла
Ret = CreateObject("WScript.Shell").Run(NameExe, 1, True)
With CreateObject("Scripting.FileSystemObject")
PNameDel = .GetParentFolderName(WScript.ScriptFullName) + "\" + NameDel
If .FolderExists(PNameDel) Then .DeleteFolder PNameDel, True
If .FileExists(PNameDel) Then .DeleteFile PNameDel, True
End With
NLOLegion
25-08-2020, 06:42
А чтобы не напрягало CMD-окно, вот VBS вариант (сохранить в 1251 кодировке) »
вот вроде всё делаю правильно, сохранил скрипт в кодировке ANSI, но ничего не происходит. Блокнот запускается, я жду несколько сек, закрываю блокнот, но файл не удаляется. В чём моя ошибка?
NameExe = "C:\Windows\System32\notepad.exe" 'Здесь прописать путь к программе
NameDel = "C:\1\scripts\2.txt" 'Здесь прописать имя папки или файла
Ret = CreateObject("WScript.Shell").Run(NameExe, 1, True)
With CreateObject("Scripting.FileSystemObject")
PNameDel = .GetParentFolderName(WScript.ScriptFullName) + "\" + NameDel
If .FolderExists(PNameDel) Then .DeleteFolder PNameDel, True
If .FileExists(PNameDel) Then .DeleteFile PNameDel, True
End With
И сразу второй вопрос, что изменить если я хочу не удалить какой-то файл, а запустить после программы какой-нибудь батник?
megaloman
25-08-2020, 07:09
удаление папки, там, куда будет помещен батник »Вы указали полный путь к файлу, скрипт к нему добавил путь к себе, а в результате файл не нашелся. Уберите в коде путь к скрипту, если хотите указывать полный путь к файлуPNameDel = .GetParentFolderName(WScript.ScriptFullName) + "\" + NameDelНе тестировал.NameExe = "C:\Windows\System32\notepad.exe" 'Здесь прописать путь к программе
NameDel = "Z:\Box_In\Длинное имя\Тест1\Тест2\Какая то папка или файл" 'Здесь прописать имя папки или файла
Ret = CreateObject("WScript.Shell").Run(NameExe, 1, True)
PNameDel = NameDel
With CreateObject("Scripting.FileSystemObject")
If InStr(NameDel, "\") <= 0 Then PNameDel = .GetParentFolderName(WScript.ScriptFullName) + "\" + NameDel
If .FolderExists(PNameDel) Then .DeleteFolder PNameDel, True
If .FileExists(PNameDel) Then .DeleteFile PNameDel, True
End With
что изменить если я хочу не удалить какой-то файл, а запустить после программы какой-нибудь батник? »NameExe = "C:\Windows\System32\notepad.exe" 'Здесь прописать путь к программе
NameBat = "D:\CMD_Forum\Soft_In\мой батник.bat" 'Здесь прописать путь к батнику
With CreateObject("WScript.Shell")
Ret = .Run(NameExe, 1, True)
Ret = .Run("cmd /c """ + NameBat + """", 1, False)
End With
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.