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:
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.
Auch dieser Aufruf bringt nicht das Ergebnis das ich will. Nach 1 Durchlauf der While-Schleife ist der Job Finished oder Failed
Danke für eure Unterstützung!
Mayho
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 638578
Url: https://administrator.de/contentid/638578
Ausgedruckt am: 23.11.2024 um 22:11 Uhr