Как получить параметр командной строки check из модуля PowerShell? - PullRequest
1 голос
/ 10 апреля 2019

Есть ли способ проверить, был ли указан параметр командной строки для скрипта PowerShell из модуля (файл .psm1)? Мне не нужно значение, просто нужно знать, был ли указан параметр. Кажется, что метод $PSBoundParameters.ContainsKey не работает.

TestParam.psm1:

function Test-ScriptParameter {
    [CmdletBinding()]
    param ()
    # This does not work (always returns false):
    return $PSBoundParameters.ContainsKey('MyParam')
}

Export-ModuleMember -Function *

TestParam.ps1:

[CmdletBinding()]
param (
    $MyParam= "Default"
)

$path = Join-Path (Split-Path -Path $PSCommandPath -Parent) 'TestParam.psm1'
Import-Module $path -ErrorAction Stop -Force

Test-ScriptParameter

Это должно вернуть false:

PS>.\TestParam.ps1

Это должно вернуть true:

PS>.\TestParam.psq -MyParam ""

Это должно вернуть true:

PS>.\TestParam.ps1 -MyParam "Runtime"

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

Это невозможно сделать так, как вы думаете об этом. Переменная PSBoundParameters является родной для выполнения командлета и поэтому зависит от блока param определения командлета. Таким образом, в вашем случае Test-ScriptParameter проверяет, был ли он вызван параметром MyParam, но поскольку он не указывает его, он всегда будет false.

Чтобы достичь того, чего, я считаю, вы хотите, вам нужно создать функцию, которая проверяет хеш-структуру, например, PSBoundParameters для определенного ключа. Ключ должен быть указан по имени. Но тогда простого $PSBoundParameters.ContainsKey('MyParam') там, где вам нужно, должно быть достаточно.

0 голосов
/ 10 апреля 2019

Проблема с вашим кодом в том, что вы проверяете значение $PSBoundParameters самой функции, которая не имеет параметров.

Вы можете заставить функцию работать, отправив переменную $PSBoundParameters из скрипта в функцию через параметр с другим именем.

Например:

TestParam.psm1:

function Test-ScriptParameter ($BoundParameters) {
    return $BoundParameters.ContainsKey('MyParam')
}

Export-ModuleMember -Function *

TestParam.ps1:

[CmdletBinding()]
param (
    $MyParam = "Default"
)

$path = Join-Path (Split-Path -Path $PSCommandPath -Parent) 'TestParam.psm1'
Import-Module $path -ErrorAction Stop -Force


Test-ScriptParameter $PSBoundParameters
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...