1. ホーム
  2. powershell

[解決済み] PowerShellでコマンドライン引数を処理する方法

2022-03-17 02:45:19

質問

コマンドライン引数を処理する最善の方法は何ですか?

何がベストなのか、いくつかの答えがあるようですが、結果的に私はこのような単純なことをどう処理したらいいのか行き詰っています。

script.ps1 /n name /d domain

AND

script.ps1 /d domain /n name.

これをうまく処理するプラグインはないのでしょうか?私はここで車輪を再発明していることを知っています。

明らかに、私がすでに持っているものはきれいではないし、確かに "best" ではありませんが、それは動作します...そしてそれは醜いです。

for ( $i = 0; $i -lt $args.count; $i++ ) {
    if ($args[ $i ] -eq "/n"){ $strName=$args[ $i+1 ]}
    if ($args[ $i ] -eq "-n"){ $strName=$args[ $i+1 ]}
    if ($args[ $i ] -eq "/d"){ $strDomain=$args[ $i+1 ]}
    if ($args[ $i ] -eq "-d"){ $strDomain=$args[ $i+1 ]}
}
Write-Host $strName
Write-Host $strDomain

解決方法は?

あなたは車輪の再発明をしています。通常のPowerShellスクリプトは、パラメータが - のように script.ps1 -server http://devserver

そして、それらを param セクションを作成します。

また、パラメータにデフォルト値を割り当てたり、利用できない場合はコンソールから読み込んだり、スクリプトの実行を停止したりすることができます。

 param (
    [string]$server = "http://defaultserver",
    [Parameter(Mandatory=$true)][string]$username,
    [string]$password = $( Read-Host "Input password, please" )
 )

スクリプトの内部では、単純に

write-output $server

すべてのパラメータはスクリプトスコープで使用可能な変数になるためです。

この例では $server を省略した場合、スクリプトは停止します。 -username パラメータを使用すると、端末の入力を要求します。 -password が省略された場合。

更新しました。 PowerShell スクリプトに "flag" (ブール値の真/偽のパラメータ) を渡したい場合もあります。たとえば、スクリプトに "force" を渡すと、force が使用されていないときにスクリプトがより慎重なモードで実行されるようにすることができます。

そのためのキーワードは [switch] パラメータの種類を指定します。

 param (
    [string]$server = "http://defaultserver",
    [string]$password = $( Read-Host "Input password, please" ),
    [switch]$force = $false
 )

スクリプトの内部では、次のように作業します。

if ($force) {
  //deletes a file or does something "bad"
}

さて、スクリプトを呼び出すときには、switch/flagパラメータを次のように設定します。

.\yourscript.ps1 -server "http://otherserver" -force

フラグが設定されていないことを明示的に示したい場合は、特別な構文があります。

.\yourscript.ps1 -server "http://otherserver" -force:$false

Microsoft の関連ドキュメントへのリンク (PowerShell 5.0 用。バージョン 3.0 と 4.0 もリンク先で利用可能)。