PowerShell: Script-Parameter
Hi,
folgendes Szenario:
Ich erstelle diverse Scripte für die Kollegen. Diese Scripte haben Parameter und erledigen diverse Aufgaben, manche ähnlich. Wodurch auch die Parameter ähnlich oder manchmal gar identisch sind, um die Anwendung der Scripte für die Kollegen intuitiver zu halten.
Soweit so gut.
Ich weiß, dass es für PowerShell-Variablen Scopes gibt, mit denen ich die Gültigkeit dieser Variablen einschränken kann. Das funktioniert auch. Nur nicht für die Parameter.
Oder etwa doch? Wenn ja: Wie muss ich das anstellen?
Im u.g. Beispiel gibt es 2 Scripte, mit verschiedenen erforderlichen Parametern, welche in Parameter Sets gruppiert sind.
Ein Parameter kommt in beiden Scripten vor (ParameterA).
Das 3. Script legt Variablen fest und ruft die beiden anderen Scripte nacheinander auf und übergibt dabei die Variablen als Parameter.
Scripte A + B sollen die von mir erstellten Scripte sein.
Script X eins von einem Kollgen, welches meine Scripte nutzt. Hier habe ich keinen Einfluss auf die Wahl der Variablennamen.
In Script X wählt der Kollege Variablennamen gleichlautend zu den Namen der Parameter, also auch dessen, welcher in beiden Scripten vorkommt: $ParameterA. Dieser "besondere" Parameter wird aber erst an das 2. Script übergeben. Für das 1. wird er nicht gebraucht, weil hier der andere Parametersatz zum Tragen kommt. Dadurch bekommt dieser Parameter im 1. Script den Wert $null und überschreibt mir jetzt im "äußeren" 3. Script die Variable. Wie kann ich das verhindern?
Bäume. Überall Bäume!
E.
Script A
Script B
Script X
Beim Aufruf von ScriptB kommt:
folgendes Szenario:
Ich erstelle diverse Scripte für die Kollegen. Diese Scripte haben Parameter und erledigen diverse Aufgaben, manche ähnlich. Wodurch auch die Parameter ähnlich oder manchmal gar identisch sind, um die Anwendung der Scripte für die Kollegen intuitiver zu halten.
Soweit so gut.
Ich weiß, dass es für PowerShell-Variablen Scopes gibt, mit denen ich die Gültigkeit dieser Variablen einschränken kann. Das funktioniert auch. Nur nicht für die Parameter.
Oder etwa doch? Wenn ja: Wie muss ich das anstellen?
Im u.g. Beispiel gibt es 2 Scripte, mit verschiedenen erforderlichen Parametern, welche in Parameter Sets gruppiert sind.
Ein Parameter kommt in beiden Scripten vor (ParameterA).
Das 3. Script legt Variablen fest und ruft die beiden anderen Scripte nacheinander auf und übergibt dabei die Variablen als Parameter.
Scripte A + B sollen die von mir erstellten Scripte sein.
Script X eins von einem Kollgen, welches meine Scripte nutzt. Hier habe ich keinen Einfluss auf die Wahl der Variablennamen.
In Script X wählt der Kollege Variablennamen gleichlautend zu den Namen der Parameter, also auch dessen, welcher in beiden Scripten vorkommt: $ParameterA. Dieser "besondere" Parameter wird aber erst an das 2. Script übergeben. Für das 1. wird er nicht gebraucht, weil hier der andere Parametersatz zum Tragen kommt. Dadurch bekommt dieser Parameter im 1. Script den Wert $null und überschreibt mir jetzt im "äußeren" 3. Script die Variable. Wie kann ich das verhindern?
Bäume. Überall Bäume!
E.
Script A
param (
[Parameter(Mandatory, ParameterSetName = "Set_1")]
$ParameterA,
[Parameter(Mandatory, ParameterSetName = "Set_1")]
$ParameterB,
[Parameter(Mandatory, ParameterSetName = "Set_2")]
$ParameterC,
[Parameter(Mandatory, ParameterSetName = "Set_2")]
$ParameterD
)
Write-Host "Parameter A: $ParameterA"
Write-Host "Parameter B: $ParameterB"
Write-Host "Parameter C: $ParameterC"
Write-Host "Parameter D: $ParameterD"
Script B
param (
[Parameter(Mandatory, ParameterSetName = "Set_4")]
$ParameterA,
[Parameter(Mandatory, ParameterSetName = "Set_4")]
$ParameterX,
[Parameter(Mandatory, ParameterSetName = "Set_5")]
$ParameterY,
[Parameter(Mandatory, ParameterSetName = "Set_5")]
$ParameterZ
)
Write-Host "Parameter A: $ParameterA"
Write-Host "Parameter X: $ParameterX"
Write-Host "Parameter Y: $ParameterY"
Write-Host "Parameter Z: $ParameterZ"
Script X
$ScriptA = "D:\Temp\ScriptA.ps1"
$ScriptB = "D:\Temp\ScriptB.ps1"
$ParameterA = "A"
$ParameterB = "B"
$ParameterC = "C"
$ParameterD = "D"
$ParameterX = "X"
$ParameterY = "Y"
$ParameterZ = "Z"
.$ScriptA -ParameterC $ParameterC -ParameterD $ParameterD
.$ScriptB -ParameterA $ParameterA -ParameterX $ParameterX
ScriptB.ps1 : Das Argument kann nicht an den Parameter "ParameterA" gebunden werden, da es NULL ist.
In ScriptX.ps1:15 Zeichen:23
In ScriptX.ps1:15 Zeichen:23
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 43505038524
Url: https://administrator.de/contentid/43505038524
Ausgedruckt am: 21.11.2024 um 13:11 Uhr
4 Kommentare
Neuester Kommentar
Der Punkt beim Aufruf eines Skriptes macht Dot-Sourcing beim Aufruf eines Skriptes und stellt Variablen der aktuellen globalen Session auch dem Skript zur Verfügung.
Wenn man nicht will das etwas aus dem Skript Variablen aus dem globalen Namespace verändert ruft man ein Skript oder Skriptblock stattdessen mittels & auf.
Dot-Sourcing
Gruß WRK
Wenn man nicht will das etwas aus dem Skript Variablen aus dem globalen Namespace verändert ruft man ein Skript oder Skriptblock stattdessen mittels & auf.
&$ScriptB -ParameterA $ParameterA -ParameterX $ParameterX
Gruß WRK
Aber ich habe keinen Einfluss auf die von Dritten erstellten Scripte. Wirklich verhindern kann ich das also von meiner Warte her nicht? Das hängt dann voll vom Dritten ab?
Mach besser gleich ein Powershell-Modul draus und lade es über Import-Module das wäre das sinnigste wenn man das mit anderen teilt! Oder greife auf die Parameterwerte eben über das $PSBoundParameters Dictionary zu.