Компьютерный форум 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=346217)

Logonius 22-08-2020 09:11 2931799

Поиск и ожидание закрытия, уже запущенного процесса
 
Всем привет,
Помогите написать батник или может как то по другому. в Общем.

Нужно, чтоб, при запуске батника, он нашел уже запущенный процесс *****.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% что не допустимо, комп должен быть не нагружен вообще. Как такое реализовать.

Iska 22-08-2020 11:51 2931810

Цитата:

Цитата Logonius
он нашел уже запущенный процесс »

А если не нашёл — тогда что?

Logonius 22-08-2020 12:39 2931814

Цитата:

Цитата Iska
А если не нашёл — тогда что? »

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

Fors1k 22-08-2020 12:44 2931815

Код:

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 2931817

Fors1k,

я дико извиняюсь, но я не але ваще=), ваш код не работает у меня, я наверное не так что-то делаю, тыкаю, и тишина), если можно для дурачков объяснить

Uragan66 22-08-2020 13:33 2931819

Logonius, это скрипт powershell.
В значении переменной $app прописываете процесс, который нужно контролировать, в переменную $del - папку, которую нужно удалять.

Logonius 22-08-2020 13:55 2931821

Uragan66,

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

но мне такой способ не подходит, надо cmd либо vbs, powershell не как не запустить, так как приложение будет стартовать следом за основным файлом и следить когда он завершиться, а после удалит файл.

Logonius 22-08-2020 14:33 2931822

Запустить удалось, погуглил =), но программа не умеет запускать его в повершел, а запускает в блокноте просто) и прописывал даже powershell -command .\test.ps1, все равно в блокноте, нужен такой же вариант только в cmd-bat-vbs

Uragan66 22-08-2020 15:38 2931836

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 2931839

Uragan66, шикарно, огромное спасибо, работает, а можно батник в exe конвертировать?, будет работать, просто мне надо чтоб он тихо в фоне включался, а так CMD окно вылазит.

Uragan66 22-08-2020 16:44 2931840

Цитата:

Цитата Logonius
можно батник в exe конвертировать? »

Logonius, можно сразу и скрипт PS компилировать в исполняемый файл, но нужны точные значения переменных $app и $del
Выложите здесь код с Вашими переменными

Uragan66 22-08-2020 17:01 2931841

Вложений: 1
Logonius, пробуйте исп. файл. Рядом нужно положить test.ps1

Logonius 22-08-2020 17:03 2931842

Uragan66,

Код:

param(
    $app = 'Spotify',
    $del = 'Data'
)cls

if(ps $app){
    while(ps $app){sleep 1}
    ri "$PSScriptRoot\$del" -rec
}
else{"$app not launched yet."}

Цитата:

Цитата Uragan66
run_proc.zip
(201.8 Kb, 0 просмотров) »

архив поврежден, пишет ошибка контрольной суммы

Uragan66 22-08-2020 17:24 2931846

Цитата:

Цитата Logonius
архив поврежден, пишет ошибка контрольной суммы »

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

Вот ещё скомпилированный скрипт PS, без батника.

Logonius 22-08-2020 17:41 2931847

Цитата:

Цитата Uragan66
Вот ещё скомпилированный скрипт PS, без батника. »

работает, че та делает вроде)), при закрытии проги, потом он следом исчезает и все, а папку не удалил за собой. ЭХ)), 3 дня мучаюсь, вроде задача простая, а так сложно реализовать.

megaloman 22-08-2020 17:45 2931848

Код:

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 2931850

megaloman, От души, дружище, работает как надо, благодарю []~( ̄▽ ̄)~*

megaloman 23-08-2020 10:50 2931907

Logonius, По видимому, моё решение прямолинейно: Вы сформулировали, как Вы хотите решить задачу, я тупо написал решение. Но, вчитываясь в Ваши посты:
Цитата:

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

Цитата:

Цитата megaloman
А чтобы не напрягало 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 2932057

Цитата:

Цитата Logonius
удаление папки, там, куда будет помещен батник »

Вы указали полный путь к файлу, скрипт к нему добавил путь к себе, а в результате файл не нашелся. Уберите в коде путь к скрипту, если хотите указывать полный путь к файлу
Код:

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


Цитата:

Цитата NLOLegion
что изменить если я хочу не удалить какой-то файл, а запустить после программы какой-нибудь батник? »

Код:

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



Время: 09:36.

Время: 09:36.
© OSzone.net 2001-