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

你可以做两件事中的一件。

将该参数标记为必填,然后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 参数。或者,您可以使用 hack 将作业推送到将参数解析为单独的函数,然后捕获调用该函数时可能发生的任何错误。因此,您的脚本将如下所示:

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

您可以尝试使用陷阱处理程序在未传递参数时提供自定义消息,然后从那里继续。陷阱处理程序适用于当前范围,因此您只需在脚本顶部定义它来处理您的错误。

例如:

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

您还可以通过设置告诉 PowerShell 在此脚本中发生错误时不要警告您

$ErrorActionPreference = SilentlyContinue

这将使 PowerShell 安静地抑制错误并尝试继续执行脚本。但是,出于显而易见的原因,抑制错误可能不是最好的主意。

于 2013-01-25T07:30:16.907 回答
0

参数([参数(强制=$true,helpmessage=“你这个傻山羊。”)]$SQL)

请原谅简洁,在电话上;)

于 2013-01-25T14:57:23.163 回答
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

MyScript.ps1 的简单方法:

Param( [switch]$sql, [string]$_ValueSql )
if ($_ValueSql){​​​​​​​
    [String]$sql=$_ValueSql
}​​​​​​​ else {​​​​​​​
    [String]$sql=""
}​​​​​​​
"sql=$sql"


Results:

.\MyScript.ps1
sql=

.\MyScript.ps1 -s
sql=

.\MyScript.ps1 -s abcd
sql=abcd
于 2020-12-11T00:53:56.623 回答