validation - 引用 Powershell 的 ValidateScript 中的其他参数

标签 validation powershell

我最初把这个问题复杂化了,现在我想简化一下:

是否有可能,更重要的是,Microsoft 正式支持我在 ValidateScript 部分中引用参数而不是被验证的参数?

这是我想做的:


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
    )
}

这是 powershell 的文档中关于 ValidateScript 参数的说明

When you use the ValidateScript attribute, the parameter value that is being validated is mapped to the $_ variable. You can use the $_ variable to refer to the parameter value in the script.

最佳答案

你让我很好奇,我进行了一些测试。您似乎可以在 ValidateScript 脚本 block 中访问其他参数的值,但前提是它们已经绑定(bind)。

即这完全取决于传递参数的顺序 - 您的 ValidateScript 参数应该在您想要在 ValidateScript 脚本 block 中访问的所有其他参数之后指定。

异常(exception)是:

  • 在按属性名称绑定(bind)时切换参数 - 在我的测试中,它们总是返回 false
  • 如果您使用 ValidateScript 的参数正在使用 ValueFromPipeline,它似乎总是最后绑定(bind),因此它可以访问所有其他参数。

附言这绝不是一项竞争性研究,所以请自行试验。

这是我的测试脚本:

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 $_"
}

结果:

================================================================================
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

关于validation - 引用 Powershell 的 ValidateScript 中的其他参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36253299/

相关文章:

powershell - 如何在 powershell 的任务调度程序中设置触发器 "on connection to user session"?

c++ - 检查具有特定格式的字符数组值

java - 检索从组中选择的 Swing 单选按钮

ruby-on-rails - Rails/嵌套属性/file_field在为空时不显示在参数中

php - JSON 错误 : parsererror

javascript - AngularJs:在数组输入上使用 $setValidity

powershell - 安装 PowerShell 5 后,我可以在版本 3 或 4 模式下运行 PowerShell 吗?

amazon-web-services - 在 powershell 中创建并保存函数以供全局使用

class - Powershell 类实现 get set 属性

arrays - 用于检查文件列表中的所有文件是否存在于给定文件夹中的 Powershell 脚本