コマンドライン引数を処理するための「最善の」方法は何ですか?
「最善の」方法とは何かという答えがいくつかあるようです。その結果、私は次のように単純なものを処理する方法にこだわっています。
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
あなたは車輪を再発明しています。通常の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もリンクから入手可能)。