2016-03-27 3 views
2

ich zu kompliziert ursprünglich die Frage, die Ich mag würde jetzt vereinfachen:auf andere Argumente in Powershell ValidateScript

Ist es möglich, und was noch wichtiger ist, offiziell von Microsoft unterstützt für mich Parameter innerhalb eines ValidateScript Abschnitt beziehen sich auf andere als der zu validierende Parameter? Hier

ist, was ich tun möchte:


function test 
{ 
    Param(
     [switch] 
     $doThingA = $False, 

     [ValidateScript({ 
      If($doThingA -eq $True -and -not (Test-Path $_ -PathType Leaf)) 
      { 
       Write-Output $False 
      } 

      Write-Output $True 
     })] 
     [string] 
     $doThingA_FilePath 
    ) 
} 

Dies ist, was Powershell in der Dokumentation Staaten über den ValidateScript Parameter

Wenn Sie das ValidateScript Attribut verwenden, wird der Parameterwert, Ist validiert wird auf die Variable $ _ zugeordnet. Sie können die Variable $ _ verwenden, um auf den Parameterwert im Skript zu verweisen.

+1

Warum die Schalter? Verwenden Sie einfach die tatsächlichen Pfadparameter als Indikator. Wenn Sie sicherstellen müssen, dass mindestens einer von ihnen festgelegt ist, überprüfen Sie dies am einfachsten im Funktionskörper. Ansonsten müssen Sie auf dynamische Parameter zurückgreifen. –

+0

Ich stimme Ansgar. Testen Sie einfach, ob die Dateipfade vorhanden sind und reagieren Sie darauf. – Matt

+0

Ja, das klingt nach einer großartigen Idee. Es kann jedoch andere Fälle geben, in denen ich einen Parameter validieren möchte, bei dem der Wert eines anderen Parameters betrachtet wird. – Bruno

Antwort

3

Sie haben mich neugierig gemacht und ich habe einige Tests durchgeführt. Es scheint, dass Sie auf die Werte anderer Parameter innerhalb eines ValidateScript Skriptblocks zugreifen können, aber nur, wenn sie bereits gebunden waren.

I.e. Es hängt alles von der Reihenfolge ab, in der Parameter übergeben wurden - Ihr Parameter mit ValidateScript sollte nach allen anderen Parametern angegeben werden, auf die Sie innerhalb des ValidateScript Skriptblocks zugreifen möchten.

Ausnahme sind:

  • Switch Parameter, wenn sie von Eigenschaftsnamen Bindung - in meinen Tests, die sie immer false zurück.
  • Wenn Ihr Parameter mit ValidateScriptValueFromPipeline verwendet, scheint es, dass es immer zuletzt gebunden ist und so auf alle anderen Parameter zugreifen kann.

P.S. Dies ist keinesfalls eine kompetitive Studie, also fühlen Sie sich frei, selbst zu experimentieren.

Hier ist mein Testskript:

function Test-ParamAccess 
{ 
    [CmdletBinding()] 
    Param 
    (
     [Parameter(ValueFromPipelineByPropertyName = $true)] 
     [switch]$Alfa, 

     [Parameter(ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] 
     [ValidateScript({ 
      'Output', [ordered]@{ 
       Alfa = $Alfa 
       Bravo = $_ 
       Charlie = $Charlie 
      } | Format-Table -Autosize | Out-String | Write-Warning 
      $true 
     })] 
     [string]$Bravo, 

     [Parameter(ValueFromPipelineByPropertyName = $true)] 
     [string]$Charlie 
    ) 
} 

$Cmdline = @(
    "-Alfa -Bravo 'BRAVO' -Charlie 'CHARLIE'", 
    "-Alfa -Charlie 'CHARLIE' -Bravo 'BRAVO'", 
    "-Bravo 'BRAVO' -Alfa -Charlie 'CHARLIE'", 
    "-Bravo 'BRAVO' -Charlie 'CHARLIE' -Alfa", 
    "-Charlie 'CHARLIE' -Alfa -Bravo 'BRAVO'", 
    "-Charlie 'CHARLIE' -Bravo 'BRAVO' -Alfa" 
) 

$Hashtable = @(
     'Alfa = $true ; Bravo = "BRAVO" ; Charlie = "CHARLIE" ;' 
     'Alfa = $true ; Charlie = "CHARLIE" ; Bravo = "BRAVO" ;' 
     'Bravo = "BRAVO" ; Alfa = $true ; Charlie = "CHARLIE" ;' 
     'Bravo = "BRAVO" ; Charlie = "CHARLIE" ; Alfa = $true ;' 
     'Charlie = "CHARLIE" ; Alfa = $true ; Bravo = "BRAVO" ;' 
     'Charlie = "CHARLIE" ; Bravo = "BRAVO" ; Alfa = $true ;' 
) | ForEach-Object { 
    Invoke-Expression "[ordered]@{$_}" 
} 

$Pipeline = @(
    "-Alfa -Charlie 'CHARLIE'", 
    "-Charlie 'CHARLIE' -Alfa" 
) 

$Separator = '=' * 80 

$Separator, 'Arguments via commandline:', $Separator | Write-Host 
$Cmdline | ForEach-Object { 
    Write-Host "Input: $_" 
    Invoke-Expression "Test-ParamAccess $_" 
} 

$Separator, 'Arguments via splatting:', $Separator | Write-Host 
$Hashtable | ForEach-Object { 
    'Input:', ($_ | Out-String) | Write-Host 
    Test-ParamAccess @_ 
} 

$Separator, 'Arguments via pipeline by property name:', $Separator | Write-Host 
$Hashtable | ForEach-Object { 
    'Input:', ($_ | Out-String) | Write-Host 
    New-Object -TypeName PsCustomObject -Property $_ | Test-ParamAccess 
} 

$Separator, 'Arguments via pipeline by value:', $Separator | Write-Host 
$Pipeline | ForEach-Object { 
    'Input:', ($_ | Out-String) | Write-Host 
    Invoke-Expression "'BRAVO' | Test-ParamAccess $_" 
} 

und Ergebnis:

================================================================================ 
Arguments via commandline: 
================================================================================ 
Input: -Alfa -Bravo 'BRAVO' -Charlie 'CHARLIE' 
WARNING: Output 


Name Value 
---- ----- 
Alfa True 
Bravo BRAVO 
Charlie  


Input: -Alfa -Charlie 'CHARLIE' -Bravo 'BRAVO' 
WARNING: Output 


Name Value 
---- ----- 
Alfa True 
Bravo BRAVO 
Charlie CHARLIE 


Input: -Bravo 'BRAVO' -Alfa -Charlie 'CHARLIE' 
WARNING: Output 


Name Value 
---- ----- 
Alfa   
Bravo BRAVO 
Charlie  


Input: -Bravo 'BRAVO' -Charlie 'CHARLIE' -Alfa 
WARNING: Output 


Name Value 
---- ----- 
Alfa   
Bravo BRAVO 
Charlie  


Input: -Charlie 'CHARLIE' -Alfa -Bravo 'BRAVO' 
WARNING: Output 


Name Value 
---- ----- 
Alfa True 
Bravo BRAVO 
Charlie CHARLIE 


Input: -Charlie 'CHARLIE' -Bravo 'BRAVO' -Alfa 
WARNING: Output 


Name Value 
---- ----- 
Alfa   
Bravo BRAVO 
Charlie CHARLIE 


================================================================================ 
Arguments via splatting: 
================================================================================ 
Input: 


Name       Value                                     
----       -----                                     
Alfa       True                                     
Bravo       BRAVO                                     
Charlie      CHARLIE                                    


WARNING: Output 


Name Value 
---- ----- 
Alfa True 
Bravo BRAVO 
Charlie  


Input: 


Name       Value                                     
----       -----                                     
Alfa       True                                     
Charlie      CHARLIE                                    
Bravo       BRAVO                                     


WARNING: Output 


Name Value 
---- ----- 
Alfa True 
Bravo BRAVO 
Charlie CHARLIE 


Input: 


Name       Value                                     
----       -----                                     
Bravo       BRAVO                                     
Alfa       True                                     
Charlie      CHARLIE                                    


WARNING: Output 


Name Value 
---- ----- 
Alfa   
Bravo BRAVO 
Charlie  


Input: 


Name       Value                                     
----       -----                                     
Bravo       BRAVO                                     
Charlie      CHARLIE                                    
Alfa       True                                     


WARNING: Output 


Name Value 
---- ----- 
Alfa   
Bravo BRAVO 
Charlie  


Input: 


Name       Value                                     
----       -----                                     
Charlie      CHARLIE                                    
Alfa       True                                     
Bravo       BRAVO                                     


WARNING: Output 


Name Value 
---- ----- 
Alfa True 
Bravo BRAVO 
Charlie CHARLIE 


Input: 


Name       Value                                     
----       -----                                     
Charlie      CHARLIE                                    
Bravo       BRAVO                                     
Alfa       True                                     


WARNING: Output 


Name Value 
---- ----- 
Alfa   
Bravo BRAVO 
Charlie CHARLIE 


================================================================================ 
Arguments via pipeline by property name: 
================================================================================ 
Input: 


Name       Value                                     
----       -----                                     
Alfa       True                                     
Bravo       BRAVO                                     
Charlie      CHARLIE                                    


WARNING: Output 


Name Value 
---- ----- 
Alfa False 
Bravo BRAVO 
Charlie CHARLIE 


Input: 


Name       Value                                     
----       -----                                     
Alfa       True                                     
Charlie      CHARLIE                                    
Bravo       BRAVO                                     


WARNING: Output 


Name Value 
---- ----- 
Alfa False 
Bravo BRAVO 
Charlie CHARLIE 


Input: 


Name       Value                                     
----       -----                                     
Bravo       BRAVO                                     
Alfa       True                                     
Charlie      CHARLIE                                    


WARNING: Output 


Name Value 
---- ----- 
Alfa False 
Bravo BRAVO 
Charlie CHARLIE 


Input: 


Name       Value                                     
----       -----                                     
Bravo       BRAVO                                     
Charlie      CHARLIE                                    
Alfa       True                                     


WARNING: Output 


Name Value 
---- ----- 
Alfa False 
Bravo BRAVO 
Charlie CHARLIE 


Input: 


Name       Value                                     
----       -----                                     
Charlie      CHARLIE                                    
Alfa       True                                     
Bravo       BRAVO                                     


WARNING: Output 


Name Value 
---- ----- 
Alfa False 
Bravo BRAVO 
Charlie CHARLIE 


Input: 


Name       Value                                     
----       -----                                     
Charlie      CHARLIE                                    
Bravo       BRAVO                                     
Alfa       True                                     


WARNING: Output 


Name Value 
---- ----- 
Alfa False 
Bravo BRAVO 
Charlie CHARLIE 


================================================================================ 
Arguments via pipeline by value: 
================================================================================ 
Input: 
-Alfa -Charlie 'CHARLIE' 


WARNING: Output 


Name Value 
---- ----- 
Alfa True 
Bravo BRAVO 
Charlie CHARLIE 


Input: 
-Charlie 'CHARLIE' -Alfa 


WARNING: Output 


Name Value 
---- ----- 
Alfa True 
Bravo BRAVO 
Charlie CHARLIE 
Verwandte Themen