emeriks
Goto Top

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
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
Beim Aufruf von ScriptB kommt:
ScriptB.ps1 : Das Argument kann nicht an den Parameter "ParameterA" gebunden werden, da es NULL ist.
In ScriptX.ps1:15 Zeichen:23

Content-ID: 43505038524

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

Ausgedruckt am: 21.11.2024 um 13:11 Uhr

13676056485
Lösung 13676056485 15.07.2024 aktualisiert um 15:37:21 Uhr
Goto Top
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.
&$ScriptB -ParameterA $ParameterA -ParameterX $ParameterX
Dot-Sourcing

Gruß WRK
emeriks
emeriks 15.07.2024 um 15:39:47 Uhr
Goto Top
OK, danke. Wieder was gelernt!

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?
13676056485
13676056485 15.07.2024 aktualisiert um 16:54:45 Uhr
Goto Top
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.
emeriks
emeriks 15.07.2024 um 16:31:54 Uhr
Goto Top
Ja, an Module habe ich auch schon gedacht.