- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最初把这个问题复杂化了,现在我想简化一下:
是否有可能,更重要的是,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/
是否可以通过 ValidateScript 使用自定义函数? ,该函数稍后在脚本中定义。 此外,在调用此函数时是否可以引用其他参数(即假设没有循环依赖)? 我理解为什么这可能是不可能的,但由于它很有用
我有以下 PowerShell 代码来验证用户输入作为路径,如果用户没有输入任何内容,我试图为他们分配一个默认值。但是,当我运行它时,$filePath变量未分配任何值。 无论如何,我可以更改它以在验
因为在 PowerShell 中没有 [ValidateNotNullOrWhiteSpace()] 参数属性,是不是更好用 [ValidateNotNullOrEmpty()] 作为参数属性,然后在
我的脚本开头有以下 Param 块: Param ( [Parameter(Mandatory = $true)] [ValidateScript({Test-Path $_ -Pat
我最初把这个问题复杂化了,现在我想简化一下: 是否有可能,更重要的是,Microsoft 正式支持我在 ValidateScript 部分中引用参数而不是被验证的参数? 这是我想做的: functio
我最近开始尝试使用 C# 进行二进制 PowerShell 编程,我在使用 ParameterValidationAttributes 时遇到了一些麻烦,主要是 ValidateScript 属性。基
我是一名优秀的程序员,十分优秀!