PowerShell でコマンドライン引数を処理する方法 質問する

PowerShell でコマンドライン引数を処理する方法 質問する

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

「最善」の方法が何であるかについてはいくつかの答えがあるようですが、結果として、次のような単純なことをどう処理すればよいかに行き詰まっています。

script.ps1 /n name /d domain

そして

script.ps1 /d domain /n name.

これをより適切に処理できるプラグインはありますか? ここで車輪の再発明をしていることは承知しています。

明らかに、私がすでに持っているものは美しくなく、確かに「最高」ではありませんが、機能します...そしてそれは醜いです。

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

ベストアンサー1

車輪の再発明です。通常の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 スクリプトに「フラグ」(ブール値の true/false パラメータ) を渡すこともできます。たとえば、スクリプトは「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"
}

ここで、スクリプトを呼び出すときに、スイッチ/フラグ パラメータを次のように設定します。

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

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

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

関連する Microsoft ドキュメントへのリンク (PowerShell 5.0 用。ただし、バージョン 3.0 および 4.0 もリンクから入手できます):

おすすめ記事