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
ValidateScript
ValueFromPipeline
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
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. –
Ich stimme Ansgar. Testen Sie einfach, ob die Dateipfade vorhanden sind und reagieren Sie darauf. – Matt
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