web-dev-qa-db-ja.com

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
422
Aaron Wurthmann

あなたは車輪を再発明しています。通常の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パラメーターを省略するとscriptは停止し、-passwordが省略されると端末入力を求めます。

更新:PowerShellスクリプトに「flag」(ブール値の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"
}

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

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

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

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

関連するMicrosoftのドキュメントへのリンク(PowerShell 5.0用。バージョン3.0および4.0もリンクから入手可能)。

779
naivists