【发布时间】:2019-03-08 03:02:30
【问题描述】:
我有一个旨在接受命名参数的脚本,我想在未命名或错误命名参数的情况下提供一些错误检查,但我发现有些奇怪。
脚本以参数块开头,像这样
param (
[string][Alias("s")] $sets,
[string][Alias("l")] $location, # /MLF #
[switch][Alias("c")] $conform,
[string][Alias("eM")] $exitMode,
[string][Alias("iM")] $interactionMode,
[string][Alias("lM")] $logMode,
[switch][Alias("tM")] $testMode,
[parameter(ValueFromRemainingArguments = $true)][object[]]$extraParameters = @()
)
然后我可以使用它来获取无关参数数据的数组并去除值,因此我可以为用户提供无关或错误命名参数的列表。都很好。
if ($extraparameters.count -gt 0) {
$invalidArguments = New-Object Collections.ArrayList
foreach ($namedParameter in $extraParameters) {
if ($namedParameter.StartsWith('-')) {
$invalidArguments.Add($namedParameter) > $null
}
}
Write-PxLog "{initError-[cf][2]}_Invalid arguments '$($invalidArguments -join ', ')'"
$proceed = $false
}
稍后我还会验证一些参数的值,例如这里我提供默认日志模式,如果没有提供日志模式,验证提供的日志模式,如果日志模式不是允许的值,则记录错误.一切正常。
if ($logMode) {
if ($validLogMode = Resolve-PxLogMode $logMode) {
$logMode = $validLogMode
} else {
Write-PxLog "{initError-[cf][2]}_Invalid -logMode '$($logMode)'"
$logMode = $null
$proceed = $false
}
} else {
$logMode = 'Terse'
}
所有这些都像预期的那样使用命名参数,所以命令行可能是
sets:Proxy -logMode:Verbose -eM:exitConsole
还不错。
但是,当我尝试针对未命名的参数进行验证时,一切都崩溃了。如果我在命令行中使用它
Proxy exitConsol verbose
我希望 $args.count 为 3,并且我希望 exitMode、interactionMode 和 logMode 为默认值。但是$args.count 是 0,甚至更奇怪的是,exitMode 会针对“详细”进行验证。我在这里的假设是 Conform 参数,作为一个开关,将其抛出,因此 $exitMode 采用第三个提供的字符串。
那么,如何强制命名参数,并测试未命名的参数,以便提供有意义的错误?我希望 $args 可以解决问题,但是如果您使用 Param() 块,似乎 $args 不会被填充,并且未指定位置的参数仍然可以是位置参数,并且只需使用 (Position=#)是否允许将该位置定义为与参数本身定义的顺序不同?
【问题讨论】:
-
不完全是重复的,因为该链接都是关于将命名参数和值放入哈希表中,而我的问题是关于处理和/或阻止未命名参数。无论如何,PowerShell 似乎仍然无法强制命名参数,我将解决这个事实。
标签: powershell