gpt4 book ai didi

powershell - 仅要求和测试命名参数

转载 作者:行者123 更新时间:2023-12-02 23:36:11 26 4
gpt4 key购买 nike

我有一个旨在使用命名参数的脚本,并且在未命名或命名错误的情况下,我想提供一些错误检查,并且我发现有些奇怪。

脚本以参数块开头,如下所示

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=#)则可以要定义的位置与参数本身的定义顺序不同?

最佳答案

AdminOfThings' answerFrode F.answer to Get ValueFromRemainingArguments as an hashtable放在一起:

[CmdletBinding(PositionalBinding=$false)]
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)][object[]]$extraParameters = @()
)
#Convert extraparameters to an OrderedDictionary (initially hashtable)
$htvars = [ordered]@{}
$iii = 0 # extraparameters counter
$lastvar = "unnamed_$iii"
$extraparameters | ForEach-Object {
$iii += 1
if($_ -match '^-') {
#New parameter
$lastvar = $_ -replace '^-'
$htvars[$lastvar] = $null
} else {
#Value
$htvars[$lastvar] = $_
$lastvar = "unnamed_$iii"
}
}
#Propagate OrderedDictionary
$htvars

上述解决方案支持以下参数:
  • 简单值(单个项目)
  • 数组值
  • 空值(开关)
  • 未命名的值

  • 示例输出:
    PS D:\PShell> .\SO\55042084a.ps1 -a111 -s 555 -abc "ABC" -num 15, 17 'ghi' -Seria "seria" "fifi" -l "llllů" -foo

    Name Value
    ---- -----
    a111
    abc ABC
    num {15, 17}
    unnamed_5 ghi
    Seria seria
    unnamed_8 fifi
    foo

    PS D:\PShell> .\SO\55042084a.ps1 a111 -s 555 -abc "ABC" -num 15, 17 'ghi' -foo -Seria "seria" "fifi" -l "llllů"

    Name Value
    ---- -----
    unnamed_0 a111
    abc ABC
    num {15, 17}
    unnamed_5 ghi
    foo
    Seria seria
    unnamed_9 fifi

    关于powershell - 仅要求和测试命名参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55042084/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com