1. ホーム
  2. powershell

[解決済み] Powershellでパラメータを切り替える

2022-03-02 23:05:38

質問

いろいろと調べてみたのですが、なかなか思い通りに動作させる方法が見つかりません。

私はPS Parametersの初心者ですが、かなり簡単だと思うことがあります。スクリプトを実行して、スイッチがあるかどうかを検出できるようにしたいのです。例えば、以下のようなものです。

myscript.ps1 -Deploy

-または

myscript.ps1

私が遊んでいるコードです。

function start-script {
    param (
        [parameter()]
        [switch]$Deploy
    )
    if ($Deploy.IsPresent) {
        Write-Host "True"
    }
    else {
    Write-Host "False"
    }
}
    
start-script

実行すると、これはエラーを返しませんが、書き込みホストの結果も出力しません。基本的に何もしないのです。私は何を間違えているのでしょうか、そしてどうすれば正しい出力が得られるのでしょうか?

ありがとうございます。 M

EDIT: 私が体験していることのスクリーンショットを追加します。 .isPresent

解決方法は?

これは、関数呼び出し(スクリプトの最終行)の中で、関数に引数を与えていないためです。もし、ps1スクリプトに外部からの引数を渡したい場合は、ps1スクリプトの最後の行に param(...) ブロックをスクリプトの先頭に追加してください。私はあなたが既に持っているコードに従いますが、この場合、関数は全く必要ないと思います。

コードはこのように簡略化できます。

param (
    [switch]$Deploy
)

if ($Deploy) {
    Write-Host "True"
}
else {
    Write-Host "False"
}

しかし、関数を使いたい場合。

param (
    [switch]$Deploy
)

function Start-Script {
    param (
        [switch]$Deploy
    )
     
    if ($Deploy) {
        Write-Host "True"
    }
    else {
        Write-Host "False"
    }
}

Start-Script @PSBoundParameters

  • PowerShellから。
PS /> .\script.ps1
False

PS /> .\script.ps1 -Deploy
True

  • CMDから。
D:\> powershell -File script.ps1
False

D:\> powershell -File script.ps1 -Deploy
True

編集

  • いくつかのコンテキスト。 [switch]$Deploy は関数のスコープ内にしか存在しないので、そのために param(...) ブロックをスクリプトの先頭に配置します。
  • を使ったスプラッター $PSBoundParameters は、複数の関数で動作させることができます。

param (
    [switch]$Deploy,
    [string]$Name
)

function Start-Script {
    param (
        [switch]$Deploy
    )

    "Deploy switch is: {0}" -f $Deploy.IsPresent
}

function SayHello {
    param(
        [string]$Name
    )

    "Hello $Name!"
}

# This is what @mclayton was referring to in his comment.
# If the Argument $Name is called:
if($PSBoundParameters.ContainsKey('Name'))
{
    # Call the function
    SayHello @PSBoundParameters
}

Start-Script @PSBoundParameters

  • PowerShellから。
PS /> .\script.ps1 -Name Santiago -Deploy
Hello Santiago!
Deploy switch is: True