h41msh1c0r
Goto Top

Powershell Rückgabedaten eines Jobs

Hi@PS Profis,

das gci als Job laufen zu lassen läuft =).

gci -Path $source -Exclude "thumb.db" -Recurse -Force -ErrorVariable FailedItems -ErrorAction SilentlyContinue -File | %{ "`n" + ($_.FullName.Replace($source, '.') + " ; " + $_.Length) + " ; " + $_.LastWriteTime.ToString() }  

Das Result bekomme ich auch raus.

$result = Receive-Job -Name gciSelection 

Wie komme ich allerdings an die "FailedItems" wenn das als Job läuft?

Wenn ich das ohne Job laufen lasse kann ich normal auf die $FailedItems drauf.
Die geb ich dann mit in einer richtextbox mit Hinweis "Access Denied".

Gruß vom H41mSh1C0r

Content-Key: 290489

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

Ausgedruckt am: 28.03.2024 um 16:03 Uhr

Mitglied: 122990
122990 09.12.2015 um 13:01:18 Uhr
Goto Top
Moin,
gibt doch einfach alle Daten zurück, z.B. als Powershell-Objekt
$result = gci -Path $source -Exclude "thumb.db" -Recurse -Force -ErrorVariable FailedItems -ErrorAction SilentlyContinue -File | %{"`n" + ($_.FullName.Replace($source, '.') + " ; " + $_.Length) + " ; " + $_.LastWriteTime.ToString()}  
New-Object PSObject -Property @{"Data"=$result;"Failed"=$FailedItems}  
Gruß grexit
Mitglied: H41mSh1C0R
H41mSh1C0R 09.12.2015 um 13:06:30 Uhr
Goto Top
Hi Grexit,

wenn ich das innerhalb des Jobs dem $result zuweise hat er keine Ergebnisse außerhalb.

Mit dem Receive-Job bekomme ich nur den einen Teil.

Ich probier das mit dem Objekt aber gleich mal ob er das nimmt.

Gruß
Mitglied: 122990
Lösung 122990 09.12.2015 aktualisiert um 14:27:48 Uhr
Goto Top
Zitat von @H41mSh1C0R:
wenn ich das innerhalb des Jobs dem $result zuweise hat er keine Ergebnisse außerhalb.
Neee, das passiert alles innerhalb des Skriptblocks des Jobs, zurückgegeben wird nur das PSObject aus dem Block heraus, dessen Variablen ja voher aufgelöst werden !! Das Object fasst beides nur in einem Objekt zusammen, welches du hinterher außerhalb auf die Eigenschaften .Failed und .Data abfragen kannst.
Simples Beispiel
$jobdata = Start-Job -ScriptBlock {
    sleep(2)
    New-Object PSObject -Property @{Data="testdaten";Failed="Fehlerdaten"}  
} | receive-job -Wait
$jobdata
Mitglied: H41mSh1C0R
H41mSh1C0R 09.12.2015 aktualisiert um 14:06:18 Uhr
Goto Top
$source ist korrekt befüllt mit C:\windows (zum Test für den Access Denied).

			$jobdata = Start-Job -ScriptBlock {
				$testdaten = gci -Path $source -Exclude "thumb.db" -Recurse -Force -ErrorVariable FailedItems -ErrorAction SilentlyContinue -File | %{ "`n" + ($_.FullName.Replace($source, '.') + " ; " + $_.Length) + " ; " + $_.LastWriteTime.ToString() }	  
				sleep(2)
				New-Object PSObject -Property @{ Data = $testdaten; Failed = $FailedItems }
			} | receive-job -Wait
			$jobdata
	
			Write-Host $jobdata.Failed
			Write-Host $jobdata.Data	

$testdaten bleibt immer leer und er springt beim debuggen über den Job rüber. ;(
Mitglied: 122990
Lösung 122990 09.12.2015 aktualisiert um 14:27:45 Uhr
Goto Top
$testdaten bleibt immer leer und er springt beim debuggen über den Job rüber. ;(
Völlig logisch...
Denke dran das ist ein Skriptblock der in einem separaten Thread(Runspace) ausgeführt wird, der hat keinen Zugriff auf lokale außerhalb des Skriptblocks definierten Variablen, also ist $source leer. Du musst diese mit dem Parameter -Argumentlist von start-job an den Skriptblock übergeben! Und dann dort via $args oder eine param()-Definition darauf zugreifen...
Mitglied: H41mSh1C0R
H41mSh1C0R 09.12.2015 um 14:27:35 Uhr
Goto Top
Rennt, danke. =)

				$jobdata = Start-Job -ArgumentList $source -ScriptBlock{
					Param($source)
					$testdaten = gci -Path $source -Exclude "thumb.db" -Recurse -Force -ErrorVariable FailedItems -ErrorAction SilentlyContinue -File | %{ "`n" + ($_.FullName.Replace($source, '.') + " ; " + $_.Length) + " ; " + $_.LastWriteTime.ToString() }	  
					sleep(2)
					New-Object PSObject -Property @{ Data = $testdaten; Failed = $FailedItems }
				} | receive-job -Wait
				$jobdata

Servus
Mitglied: 122990
122990 09.12.2015 aktualisiert um 14:30:00 Uhr
Goto Top
Rennt, danke. =)
Schön face-smile

Aber das sleep(2) kannst du jetzt rausnehmen, das war ja nur ein Platzhalter für "Arbeit" in meinem Beispielskript face-wink

Gruß grexit