beyondhell
Goto Top

PowerShell Variablen zwischen Skripten übergeben

Hallo,

ich hoffe ich bin hier richtig.
Mit PowerShell habe ich erst vor kurzem angefangen. Derzeit stehe ich vor folgendem Problem:

Skript 1: Grafische Oberfläche zur Abfrage einer ID, Prüfung dieser ID, Ausführen von Skript 2 wenn Abfrage der ID erfolgreich

Skript 2: Grafische Oberfläche zur Auswahl verschiedener durchführbarer Prozesse (weitere PowerShell Skripte)

Skript 3: Grafische Oberfläche für in Skript 2 gewählte Prozesse, falls für die Durchführung der Prozesse noch spezifische Daten angegeben werden müssen.

Skript 4 und mehr: die ganzen Skripte, die im Hintergrund ausgeführt werden sollen, wenn der Nutzer sie über Skript 1-3 auswählt.

Von Skript 1 muss ich zu Skript 2 also die ID übergeben. Von Skript 2 muss ich die ID den ausgewählten Skripten übergeben. Falls weitere Daten angegeben werden müssen wird die ID also auch in Skript 3 benötigt, von wo aus die ID und die dort angegebenen Daten an das letztendlich auszuführende Skript übergeben werden muss.

Ich hoffe ich konnte einigermaßen verständlich erklären um was es geht. Könnte mir wer erklären wie ich die Variablen am besten übergebe? Im Idealfall einfach bei der Übergabe der ID von Skript 1 zu Skript 2. Ich habe zwar Anleitungen gelesen, aber da waren mir die Beispiele zu abstrakt. Wenn ich es ein mal konkret bei meinem Problem korrekt angewendet sehe, dann kann ich es i.d.R. in Zukunft auch selbstständig selbst einsetzen. Dann macht es auch bei mir Klick.

Vielen lieben Dank!

Content-Key: 560817

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

Printed on: April 25, 2024 at 11:04 o'clock

Member: Kraemer
Kraemer Mar 25, 2020 at 14:24:33 (UTC)
Goto Top
Moin,

Parameter (param) ist dein Freund: https://www.script-example.com/powershell-skript

Gruß
Member: BeyondHell
BeyondHell Mar 25, 2020 at 14:30:14 (UTC)
Goto Top
So wie ich das bisher verstanden habe muss man die Parameter am Anfang deklarieren. Das wäre dann nicht möglich, denn die ID bekomme ich erst zur Laufzeit. Oder ist mit "am Anfang" wie es in vielen Anleitungen genannt wird, lediglich vor der Übergabe gemeint?
Danke für die schnelle Antwort!
Member: Kraemer
Kraemer Mar 25, 2020 at 14:35:24 (UTC)
Goto Top
Zitat von @BeyondHell:

So wie ich das bisher verstanden habe muss man die Parameter am Anfang deklarieren.
wo denn auch sonst? Du willst ja schließlich abhängig von dem Wert arbeiten

Das wäre dann nicht möglich, denn die ID bekomme ich erst zur Laufzeit.
die ist schon klar, das dein Script 1 keinen param braucht? Eben genau aus den von dir genannten Gründen

BTW: 2 kleine Testscripte hätte man in 2 Minuten geschrieben und könnte daraus eine Menge lernen und ableiten

Gruß
Member: erikro
erikro Mar 25, 2020 at 14:56:31 (UTC)
Goto Top
Moin,

Zitat von @BeyondHell:

So wie ich das bisher verstanden habe muss man die Parameter am Anfang deklarieren. Das wäre dann nicht möglich, denn die ID bekomme ich erst zur Laufzeit. Oder ist mit "am Anfang" wie es in vielen Anleitungen genannt wird, lediglich vor der Übergabe gemeint?
Danke für die schnelle Antwort!

Am Anfang heißt am Anfang. Vor dem PARAM-Block darf nichts stehen. So mal auf die Schnelle in Pseudocode:

# Skript 1

function find_Id() {

   was_auch_immer_gemacht_werden_muss
   return $Variable_Mit_ID

}

$id = find_id()

skript2.ps1 -id $id

# Skript 2

PARAM(

    $id

)

mach_was_mit_der_ID

skript3.ps1 -id $id -prozesse $Array_mit_prozessen

#skript 3

PARAM (

    $id, #ACHTUNG hier muss ein Komma hin!
    [array]$prozesse

)

mach_wieder was

usw.

Guckst Du auch hier:
https://www.msxfaq.de/code/powershell/psparam.htm

hth

Erik
Member: mayho33
mayho33 Mar 25, 2020 at 15:08:30 (UTC)
Goto Top
Zitat von @BeyondHell:

So wie ich das bisher verstanden habe muss man die Parameter am Anfang deklarieren.

Also! Du hast 2 Möglichkeiten. Entweder übergibst du einem Script die Argumente außerhalb einer Function:

<#
.SYNOPSIS
    blabla blup
.PARAMETER Doing
    [SWITCH] schaltet irgendwas um
.PARAMETER Pfad
    [STRING] Der Pfad
.EXAMPLE
    powershell.exe -Executionpolicy Bypass -file mein.ps1
.EXAMPLE
    powershell.exe -Executionpolicy Bypass -file Install.ps1 -Doing
.EXAMPLE
    powershell.exe -Executionpolicy Bypass -file Install.ps1 -Doing -Pfad "C:\Mein\Pfad"  
#>
[CmdletBinding()]
Param 
(
	[Parameter(Mandatory=$false, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)][switch]$Doing,
    [Parameter(Mandatory=$false, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)][string]$Pfad
)
...
...
...


oder innerhalb einer Function:
Function Get-Files {
    <#
    .SYNOPSIS
        blabla blup
    .PARAMETER Doing
        [SWITCH] schaltet irgendwas um
    .PARAMETER Pfad
        [STRING] Der Pfad
    .EXAMPLE
        powershell.exe -Executionpolicy Bypass -file mein.ps1
    .EXAMPLE
        powershell.exe -Executionpolicy Bypass -file Install.ps1 -Doing
    .EXAMPLE
        powershell.exe -Executionpolicy Bypass -file Install.ps1 -Doing -Pfad "C:\Mein\Pfad"  
    #>
    [CmdletBinding()]
    Param 
    (
	    [Parameter(Mandatory=$false, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)][switch]$Doing,
        [Parameter(Mandatory=$false, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)][string]$Pfad
    )
    begin {
        if(![System.IO.Directory]::Exists($Path))
        {
            return $null
        }
    }
    process {
        try
        {
            $result = [System.IO.Directory]::GetFiles($Pfad, "*.*", [System.IO.SearchOption]::AllDirectories)  
        }
        catch [Exception]
        {
            return $null
        }
    }

    end {
        Return $result
    }
}


Im Beispiel 1 kannst du das Script und seine Parameter direct ansprechen:
powershell.exe -Executionpolicy Bypass -file Install.ps1 -Doing -Pfad "C:\Mein\Pfad"  

Im Bespiel 2 geht das so:
powershell.exe -Executionpolicy Bypass -file mein.ps1; Get-Files -Doing -Pfad "C:\Mein\Pfad"  

Functions machst du, weil du so mehrere Methoden in einem File anlegen kannst und diese dann auch einzeln ansprechen kannst. Sprich: Bessere Steuerung.
Außerdem dient es der Lesbarkeit des Codes. Eine einzelne Function ist besser zu verstehen als 4 km Würstelcode.

Grüße!
Member: BeyondHell
BeyondHell Mar 25, 2020 at 15:35:06 (UTC)
Goto Top
So langsam machts Klick bei mir. Gerade das, was du hier geschrieben hast bringt mich ein ganzes Stück weiter. Vielen Dank dafür!
___

Ich hoffe ihr interpretiert die Fragen hier nicht einfach als Faulheit. Anleitungen, YT Videos,... Da war echt so vieles dabei und ich habe es wirklich nicht verstanden.
Bei C# wars recht ähnlich. Klassen erstellen und Aufrufen mit Parameterübergabe war für mich eine Katastrophe. Da habe ich die Anleitungen auch erst verstanden nachdem mir das bei meinem Code gezeigt wurde, obwohl es da komplizierter war. Danach war es mir auch unbegreiflich wie ich das nicht verstehen konnte. Bei meinen Scripten denke ich immer ein wenig mit "Gegenständen". Da habe ich alles bildlich vor mir, damit kann ich arbeiten. Sobald ich keinen effektiven Nutzen dahinter sehe und damit nichts bildliche habe wirds problematisch.
Ich werde das Ganze jetzt erst mal in abgespeckter Version ohne die GUI testen, falls es klappt dann auch im eigentlichen Script und mich so oder so nochmal melden.
Member: mayho33
mayho33 Mar 25, 2020 at 15:57:10 (UTC)
Goto Top
Zitat von @BeyondHell:

So langsam machts Klick bei mir. Gerade das, was du hier geschrieben hast bringt mich ein ganzes Stück weiter. Vielen Dank dafür!

Sehr gut! Zum Scripten in PS verwendest du am besten die ISE. Ist on Board und wirklich nicht schlecht. Du kannst mit F9 Haltepunkte setzen und schauen was in der Variablen so abläuft.

Hat mir anfangs sehr geholfen und ich verwende sie auch jetzt noch zum Entwickeln.
Member: BeyondHell
BeyondHell Mar 25, 2020 at 17:59:52 (UTC)
Goto Top
Ich habe definitiv einen Fehler beim Aufrufen von Script 2. Start-Process führt zum Öffnen der entsprechenden Textdatei.

Wie setze ich den Pseudo-Code von erikro an der Stelle "Skript.ps1 -id $ID" korrekt um?
Member: erikro
erikro Mar 25, 2020 at 18:02:25 (UTC)
Goto Top
Wie wäre es, wenn Du uns mal zeigst, was Du hast? face-wink Bitte um das Skript < code> und </ code> (ohne die Leertasten) schreiben.
Member: BeyondHell
BeyondHell Mar 26, 2020 at 06:40:08 (UTC)
Goto Top
Eine 3/4 Nacht und 1h Schlaf später hab ichs gebacken bekommen. Jetzt stellt sich wie üblich die Frage, was daran so schwer war. An einigen anderen Stellen konnte ich es schon erfolgreich anwenden. Bei einer bastel ich gerade noch rum. Eine foreach-Schleife zur dynamischen Erstellung der Button-Click-Events. Mal sehen wie es da läuft. Ich muss jetzt weiter arbeiten, das Projekt müsste schon längst fertig sein.
Danke für eure Hilfe!
Member: mayho33
mayho33 Mar 26, 2020 at 09:24:26 (UTC)
Goto Top
Zitat von @BeyondHell:

Bei einer bastel ich gerade noch rum. Eine foreach-Schleife zur dynamischen Erstellung der Button-Click-Events.

Ich frage mich warum du unbedingt schon in der mittlerern Liga mitspielen willst, wenn du noch nicht mal die Grundlagen verstanden hast. So nagelst du dir nur selbst Bretter an den Kopf.

BSP:
  • Was ist ein Verb?
  • was ist ein Noun?
  • Wie setzen sich die Befehle in PS zusammen?
  • Was ist Piping und wie funktioniert es?
  • Was sind die Grund-Befehle in PS?
  • Das Dot.Net-Framework: Wie spreche ich es an?
  • Wie erstelle ich mir ein Objekt aus XY des Framework?

und wenn du von den Fragen oben einmal wenigstens eine Ahnung hast, dann kannst du dich mit dynamische Ereignissen befassen.
Schau dir nochmal die Grundlagen an. Bastel ein paar kleine Scripts und Methoden. Kombiniere sie, binde DLLs ein.

Nicht falsch verstehen! Ich will auch lieber die Lösung anstatt mich damit befassen zu müssen. Gegen Ende der Entwicklung musste ich aber meistens erkennen, dass es entweder..

  • schon ganz einfache Lösungen gab
  • PS, C#, sogar VBS in ihren Tiefen die Lösung auch schon liefern. Man muss sie nur kennen.

Grüße!
Member: BeyondHell
BeyondHell Mar 26, 2020 at 14:08:37 (UTC)
Goto Top
Anweisung von oben, da kann ich leider nichts machen. Mir wäre es auch lieber ich würde Grundlagen zuerst lernen.
Das ist nicht nur im Bereich PowerShell so.
Ich versuche außerhalb der Ausbildung Wissen zu erlangen, aber da komme ich im Prinzip nicht hinterher. Es heißt nur "mach mal, Google ist dein Freund, bis dahin muss das Ding fertig sein". In dem Fall unter der Anforderung dynamischer Aufbau wo es nur geht
Member: erikro
erikro Mar 26, 2020 at 14:22:35 (UTC)
Goto Top
Zitat von @BeyondHell:

Anweisung von oben, da kann ich leider nichts machen. Mir wäre es auch lieber ich würde Grundlagen zuerst lernen.
Das ist nicht nur im Bereich PowerShell so.
Ich versuche außerhalb der Ausbildung Wissen zu erlangen, aber da komme ich im Prinzip nicht hinterher. Es heißt nur "mach mal, Google ist dein Freund, bis dahin muss das Ding fertig sein". In dem Fall unter der Anforderung dynamischer Aufbau wo es nur geht

Hmmmmm, alle jammern über den Fachkräftemangel aber keiner will vernünftig ausbilden. face-sad