mayho33
Goto Top

Powershell BackGround-Job zur Script-Laufzeit auf Prozess prüfen

Hi @ All

Ich habe leichte Verständnisprobleme was Powershell Jobs angeht und hoffe auf eure Hilfe.

Was will ich tun?
In einem ps1-Script führe ich mehrere Operationen aus die mitunter etwas länger dauern könnten. Auf jeden Fall wird mit dem Script noch ein anderer Process gestartet der so lange laufen muss muss wie auch das Script läuft.

Nun möchte in in einem Background-Job "wiederkehrend" prüfen ob der besagte Process noch läuft, und wenn nicht, soll eine Variable beschrieben werden deren Value geprüft werden kann.

In C# ist das ja ganz einfach:
using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;

namespace TESTER
{
    public class BackGroundTask
    {
        public static bool MyExternalVariable = true;

        public static bool CheckForRunningPorcess(int procID)
        {
            CancellationTokenSource canSource = new CancellationTokenSource();
            CancellationToken canToken        = canSource.Token;

            Task.Run(() =>
            {
                while (MyExternalVariable == true)
                {
                    Process runProc = null;
                    try
                    {
                        runProc = Process.GetProcessById(procID);
                    }
                    catch (Exception) { }

                    try
                    {
                        if (runProc == null)
                        {
                            canSource.Cancel();
                            MyExternalVariable = false;
                        }

                    }
                    catch (Exception) { }

                    Thread.Sleep(500);
                }
            }, canToken).Wait();

            return MyExternalVariable;
        }
    }
}

Also dachte ich ich übernehme das gleich so, aber der Job checkt nicht dass der Process nicht mehr läuft. Was mache ich falsch?
Hinweis: zum Testen habe ich einfach eine cmd.exe gestartet und beende diese irgendwann wieder.

Function Test-Process() {
    [CmdletBinding()]
    param 
    (
        [parameter(Mandatory=$false, ValueFromPipeline=$true, ParameterSetName = "HEADER")]  
        [int]$ID
    )

$code = @"  
using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;

namespace TESTER
{
    public class BackGroundTask
    {
        public static bool MyExternalVariable = true;

        public static bool CheckForRunningPorcess(int procID)
        {
            CancellationTokenSource canSource = new CancellationTokenSource();
            CancellationToken canToken        = canSource.Token;

            Task.Run(() =>
            {
                while (MyExternalVariable == true)
                {
                    Process runProc = null;
                    try
                    {
                        runProc = Process.GetProcessById(procID);
                    }
                    catch (Exception) { }

                    try
                    {
                        if (runProc == null)
                        {
                            canSource.Cancel();
                            MyExternalVariable = false;
                        }

                    }
                    catch (Exception) { }

                    Thread.Sleep(500);
                }
            }, canToken).Wait();

            return MyExternalVariable;
        }
    }
}
"@  

  Add-Type -TypeDefinition $code -Language CSharp
  
 $result = [TESTER.BackGroundTask]::CheckForRunningPorcess("$ID")  
}



(Get-Job | Remove-Job) | Out-Null
$result = $true
Start-Job {Test-Process -ID 8120}

while ($result -eq $true)
{
    Write-Host "running...."  
    Start-Sleep -Seconds 2
}

Write-Host "Finished...."  

Auch dieser Aufruf bringt nicht das Ergebnis das ich will. Nach 1 Durchlauf der While-Schleife ist der Job Finished oder Failed
(Get-Job | Remove-Job) | Out-Null
$result = $true
Start-Job -Name "CHECKER" {Test-Process -ID 16732}  

while ( (Get-Job -Name CHECKER).State -eq "Running" )  
{
    Write-Host "running...."  
    Start-Sleep -Seconds 2
}

Write-Host "Finished...."  

Danke für eure Unterstützung!

Mayho

Content-ID: 638578

Url: https://administrator.de/contentid/638578

Ausgedruckt am: 23.11.2024 um 22:11 Uhr