none
Receive-Job aus zweitem Script RRS feed

  • 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


    Dienstag, 2. Oktober 2012 07:43

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
    Dienstag, 2. Oktober 2012 09:11

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
    Dienstag, 2. Oktober 2012 09:11
  • Puh ok, dann funtz das leider nicht so wie gedacht.

    Aber danke für die Hilfe jetzt weiss ich wenigstens warum ich da nicht rankam.

    Gruß

    Hanz

    Dienstag, 2. Oktober 2012 12:09