4

たとえば、私のスクリプトは次のように呼び出すことができます。

.\MyScript.ps1 -s <hostname1>

-s パラメータで引数を渡さずに呼び出すと、エラーが発生します。

.\MyScript.ps1 -s

C:\MyScript.ps1 : Missing an argument for parameter 'sql'. Specify a pa
rameter of type 'System.String' and try again.
At line:1 char:18
+ .\MyScript.ps1 -s <<<<
    + CategoryInfo          : InvalidArgument: (:) [MyScript.ps1],     ParameterBindingException
    + FullyQualifiedErrorId : MissingArgument,MyScript.ps1

このエラーを抑制する方法、またはカスタム エラーを表示する方法はありますか。

.\MyScript.ps1 -s

Please pass a hostname with the s argument:
.\MyScript.ps1 -s <hostname>
4

5 に答える 5

1

2 つのうちの 1 つを行うことができます。

パラメータを必須としてマークすると、powershell は自動的にユーザーにクエリを実行します。

PARAM(  [Parameter(Mandatory=$true)][string]$sql )
PROCESS
{
    "You entered: " + $sql
}

与える:

# C:\Temp> .\prompt.ps1 
cmdlet prompt.ps1 at command pipeline position 1
Supply values for the following parameters:
sql: asdsaa
You entered: asdsaa

または、ユーザーからの入力を照会するデフォルトのパラメーターとして式を提供することもできます。

PARAM(  [string]$sql = (read-host "Enter a value for sql parameter") )

PROCESS
{
    "You entered: " + $sql
}

与える:

# C:\Temp> .\prompt.ps1 
Enter a value for sql parameter: hello
You entered: hello

編集:

あなたのコメントに応えて。必要な動作を得るために私が考えることができる唯一の回避策は、パラメーターを指定せずに $args 引数を自分で処理することです。または、引数を解析して別の関数にジョブをプッシュし、その関数を呼び出すときに発生する可能性のあるエラーをトラップするハックを採用することもできます。したがって、スクリプトは次のようになります。

function parsePrompt ( [string]$sql)
{
    $sql
}

$cmd = "parsePrompt $($args -join " ")"
try
{
    $sql = invoke-expression $cmd
}
catch [System.Management.Automation.ParameterBindingException]
{
    $sql = read-host "Enter a value for sql parameter"
}
"You entered: " + $sql

与える:

# C:\Temp> .\Prompt.ps1 -s
Enter a value for sql parameter: dsfds
You entered: dsfds


# C:\Temp> .\Prompt.ps1 -s dfds
You entered: dfds
于 2013-01-24T23:29:11.057 に答える
0

私があなたの意図を正しく読んだ場合、プロンプトではなくエラーが必要です...そう:

# MyScript
param (
    $sql = $(throw @"
    Oops!
    Dude, this script requires SQL parameter!
    Run it like that: .\MyScript -s <hostname>
"@)
)
    "Got $sql"
}

v1 の「必須」パラメータを使用できます。

于 2013-01-25T19:38:16.983 に答える
0

Param([parameter(mandatory =$true, helpmessage= "あなたは愚かなヤギです。")] $SQL)

電話で、簡潔さを許してください;)

于 2013-01-25T14:57:23.163 に答える
0

トラップ ハンドラーを使用して、引数が渡されない場合にカスタム メッセージを提供し、そこから続行することもできます。トラップ ハンドラーは現在のスコープで機能するため、スクリプトの先頭で定義するだけでエラーを処理できます。

例えば:

trap [ArgumentException] {
    write-host "Please pass a hostname with the s argument"
    break
}

このスクリプトでエラーが発生したときに警告しないように PowerShell に指示することもできます。

$ErrorActionPreference = SilentlyContinue

これにより、PowerShell は静かにエラーを抑制し、スクリプトの実行を続行しようとします。ただし、明らかな理由から、エラーを抑制することはおそらく最善の方法ではありません。

于 2013-01-25T07:30:16.907 に答える