У меня есть сценарий, предназначенный для принятия именованных аргументов, и я хотел бы обеспечить некоторую проверку ошибок в случае неназванных или неправильно названных аргументов, и я вижу некоторую странность.
Сценарий начинается сблок параметров, такой как
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=#)
простопозволяет определить эту позицию как отличную от порядка определения самих параметров?