コマンドライン引数を処理する「最善の」方法は何ですか?
「最善」の方法が何であるかについてはいくつかの答えがあるようですが、結果として、次のような単純なことをどう処理すればよいかに行き詰まっています。
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 もリンクから入手できます):