Benutzer mit den meisten Antworten
Receive-Job aus zweitem Script

Frage
-
Hallo,
ich hab ne Frage zu einer Statusabfrage von start-job. Ist es möglich den Status eines Jobs der über das start-job cmdlet gestartet wurde, aus einen zweiten script abzufragen? Also z.B.
Skript 1)
Start-Job -Name "JobID: 1" -FilePath C:\Jobs\XY.ps1
Skript 2)
Receive-Job -Name "JobID:1" ???
Wär super wenn mir da jemand helfen könnte, oder ist das so nicht möglich?
Gruß
Hanz
- Bearbeitet Denniver ReiningMVP, Moderator Mittwoch, 3. Oktober 2012 10:34 Titel angepasst
Antworten
-
Es kommt darauf an, wie du die verschiedenen Scripts startest.
Jede PowerShell läuft in einem Prozess oder Thread in diesen gibt es eine PowerShell Umgebung die Runspace oder Session genannt wird (beides wird synonym gebraucht).
Wenn du ein Script startest, wird eine PowerShell Session gestartet in dem dein Script abläuft.
Wenn die Skripte in verschiedenen PowerShell Instanzen (Powershell.exe Sessions) gestartet werden, dann kannst du die Ressourcen (Jobs) nicht austauschen. Da jedes Script in seiner eigenen Laufzeit Umgebung (Prozess + Session) läuft.
Soweit ich weiss …!?
Startest du das zweite Script mit dem . (Punkt) Operator (. .\Script2.ps1) von dem ersten Skript heraus, dann läuft das 2. Script in derselben Session wie das erste.
Da sich beide die Scripts Laufzeitumgebung teilen können Sie sich auch alle Ressourcen (Variablen usw..) Teilen.
Nun bleibt noch eine Hürde zu nehmen das sind die Scopes.
Jede Ressource (Variable usw…) existiert in einem bestimmten Scope. Das heißt die Ressource ist nur innerhalb eines bestimmten Rahmen sicht- und zugreifbar.
Da dein Job in dem einen Script erstellt wird ist dein Job auch nur von diesem Script zu sehen und zu bearbeiten. Der Job hat den Script-Scope.
Nun kannst du den Job einfach als Argument an das zweite Script übereichen und schon kann das zweite Script auch auf den Job zugreifen.
Das zweite Skript muss dieses Argument dann natürlich aus $Args oder anders als Argument verarbeiten.
Etwa so, Aufruf innerhalb des ersten Skripts (Script1.ps1):
# Job mit Sekunden Countdown erstellen (läuft 120 Sekunden) $MyJob = Start-Job -ScriptBlock { For($I=120;$I -gt -1 ;$I--){Start-Sleep -Seconds 1; ([string]$I + ' Seconds to go')} } # Job Zeit geben zum Arbeiten (10 Sekunden) Start-Sleep -Seconds 10 # Job an Script 2 übergeben . C:\Temp\Script2.ps1 $MyJob
Und hier das zweite Script Script2.ps1:
# Job aus $Args[0] auslesen und Ergebnisse in eine Datei ausgeben Receive-Job $args[0] | Out-File C:\Temp\scripttest.txt
Nun kannst du die Jobvariable in den Globalen Scope heben.Der Globale Scope liegt im Rahmen der Session und somit sind im Globalen Scope alle Ressourcen für alle sichtbar die in dieser Session arbeiten.
Etwa so, Aufruf innerhalb des ersten Skripts (Script1.ps1):# Job mit Sekunden Countdown erstellen (läuft 120 Sekunden) $Global:MyJob = Start-Job -ScriptBlock { For($I=120;$I -gt -1 ;$I--){Start-Sleep -Seconds 1; ([string]$I + ' Seconds to go')} } # Job Zeit geben zum Arbeiten (10 Sekunden) Start-Sleep -Seconds 10 # Script 2 starten . C:\Temp\Script2.ps1
Und hier das zweite Script Script2.ps1:
# Job aus dem Globalen Scope auslesen und Ergebnisse in eine Datei ausgeben Receive-Job $Global:MyJob | out-File C:\Temp\scripttest2.txt
Siehe in der PowerShell Hilfe:
Get-Help about_scopes -Full
http://technet.microsoft.com/de-de/library/dd315289.aspx
Get-Help about_Jobs -Full
http://technet.microsoft.com/de-de/library/dd315273.aspx
Get-Help about_PSSession_Details -Full
http://technet.microsoft.com/de-de/library/dd347653.aspx
Get-Help about_PSSessions -Full
http://technet.microsoft.com/de-de/library/dd347706.aspx
Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
- Bearbeitet Peter Kriegel Dienstag, 2. Oktober 2012 09:36
- Als Antwort markiert Hanz999 Dienstag, 2. Oktober 2012 12:04
Alle Antworten
-
Es kommt darauf an, wie du die verschiedenen Scripts startest.
Jede PowerShell läuft in einem Prozess oder Thread in diesen gibt es eine PowerShell Umgebung die Runspace oder Session genannt wird (beides wird synonym gebraucht).
Wenn du ein Script startest, wird eine PowerShell Session gestartet in dem dein Script abläuft.
Wenn die Skripte in verschiedenen PowerShell Instanzen (Powershell.exe Sessions) gestartet werden, dann kannst du die Ressourcen (Jobs) nicht austauschen. Da jedes Script in seiner eigenen Laufzeit Umgebung (Prozess + Session) läuft.
Soweit ich weiss …!?
Startest du das zweite Script mit dem . (Punkt) Operator (. .\Script2.ps1) von dem ersten Skript heraus, dann läuft das 2. Script in derselben Session wie das erste.
Da sich beide die Scripts Laufzeitumgebung teilen können Sie sich auch alle Ressourcen (Variablen usw..) Teilen.
Nun bleibt noch eine Hürde zu nehmen das sind die Scopes.
Jede Ressource (Variable usw…) existiert in einem bestimmten Scope. Das heißt die Ressource ist nur innerhalb eines bestimmten Rahmen sicht- und zugreifbar.
Da dein Job in dem einen Script erstellt wird ist dein Job auch nur von diesem Script zu sehen und zu bearbeiten. Der Job hat den Script-Scope.
Nun kannst du den Job einfach als Argument an das zweite Script übereichen und schon kann das zweite Script auch auf den Job zugreifen.
Das zweite Skript muss dieses Argument dann natürlich aus $Args oder anders als Argument verarbeiten.
Etwa so, Aufruf innerhalb des ersten Skripts (Script1.ps1):
# Job mit Sekunden Countdown erstellen (läuft 120 Sekunden) $MyJob = Start-Job -ScriptBlock { For($I=120;$I -gt -1 ;$I--){Start-Sleep -Seconds 1; ([string]$I + ' Seconds to go')} } # Job Zeit geben zum Arbeiten (10 Sekunden) Start-Sleep -Seconds 10 # Job an Script 2 übergeben . C:\Temp\Script2.ps1 $MyJob
Und hier das zweite Script Script2.ps1:
# Job aus $Args[0] auslesen und Ergebnisse in eine Datei ausgeben Receive-Job $args[0] | Out-File C:\Temp\scripttest.txt
Nun kannst du die Jobvariable in den Globalen Scope heben.Der Globale Scope liegt im Rahmen der Session und somit sind im Globalen Scope alle Ressourcen für alle sichtbar die in dieser Session arbeiten.
Etwa so, Aufruf innerhalb des ersten Skripts (Script1.ps1):# Job mit Sekunden Countdown erstellen (läuft 120 Sekunden) $Global:MyJob = Start-Job -ScriptBlock { For($I=120;$I -gt -1 ;$I--){Start-Sleep -Seconds 1; ([string]$I + ' Seconds to go')} } # Job Zeit geben zum Arbeiten (10 Sekunden) Start-Sleep -Seconds 10 # Script 2 starten . C:\Temp\Script2.ps1
Und hier das zweite Script Script2.ps1:
# Job aus dem Globalen Scope auslesen und Ergebnisse in eine Datei ausgeben Receive-Job $Global:MyJob | out-File C:\Temp\scripttest2.txt
Siehe in der PowerShell Hilfe:
Get-Help about_scopes -Full
http://technet.microsoft.com/de-de/library/dd315289.aspx
Get-Help about_Jobs -Full
http://technet.microsoft.com/de-de/library/dd315273.aspx
Get-Help about_PSSession_Details -Full
http://technet.microsoft.com/de-de/library/dd347653.aspx
Get-Help about_PSSessions -Full
http://technet.microsoft.com/de-de/library/dd347706.aspx
Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
- Bearbeitet Peter Kriegel Dienstag, 2. Oktober 2012 09:36
- Als Antwort markiert Hanz999 Dienstag, 2. Oktober 2012 12:04