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!
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!
Please also mark the comments that contributed to the solution of the article
Content-Key: 560817
Url: https://administrator.de/contentid/560817
Printed on: April 25, 2024 at 11:04 o'clock
13 Comments
Latest comment
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 arbeitenSo 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.
die ist schon klar, das dein Script 1 keinen param braucht? Eben genau aus den von dir genannten GründenBTW: 2 kleine Testscripte hätte man in 2 Minuten geschrieben und könnte daraus eine Menge lernen und ableiten
Gruß
Moin,
Am Anfang heißt am Anfang. Vor dem PARAM-Block darf nichts stehen. So mal auf die Schnelle in Pseudocode:
Guckst Du auch hier:
https://www.msxfaq.de/code/powershell/psparam.htm
hth
Erik
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!
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
Zitat von @BeyondHell:
So wie ich das bisher verstanden habe muss man die Parameter am Anfang deklarieren.
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!
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!
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.
Zitat von @BeyondHell:
Bei einer bastel ich gerade noch rum. Eine foreach-Schleife zur dynamischen Erstellung der Button-Click-Events.
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!
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
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.