558

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

「最良の」方法とは何かについていくつかの答えがあるようです。その結果、私は次のような単純なものを処理する方法に固執しています。

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
4

1 に答える 1

1044

あなたは車輪の再発明をしています。-通常の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

更新:「フラグ」(ブール値のtrue / falseパラメーター)をPowerShellスクリプトに渡すこともできます。たとえば、スクリプトは「フォース」を受け入れる場合があります。フォースが使用されていない場合、スクリプトはより注意深いモードで実行されます。

そのためのキーワードは[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もリンクから入手できます):

于 2010-01-28T20:13:40.883 に答える