防止在脚本中交互式提示输入参数值

时间:2019-03-14 20:01:17

标签: powershell syntax parameter-passing prompt non-interactive

我有一个脚本pingtest.ps1,它会进行以下调用:

Start-abc -SourceIpaddress x.y.x.z -Protocol TCP -DestinationIpAddress a.c.d.e

在执行期间,它会提示您输入源端口和目标端口。

如何避免这些交互式提示,而是在同一脚本中传递值?

1 个答案:

答案 0 :(得分:0)

tl; dr

在您的-SourcePort 42呼叫中添加-DestinationPort 666Start-abc之类的内容应避免出现这些交互式提示(当然,您必须提供适当的值来代替示例值42666在这里使用)。

要确定这些参数的确切名称以及背景信息,请继续阅读


如果命令的调用未向其所有强制性参数提供参数(要求值以使命令运行的参数):

  • PowerShell通过交互方式提示输入这些参数
  • 并且仅当您提供所有必需的参数(使用有效值)时,命令才会真正执行。

注意:这种提示机制在实践中很少使用,并且不适用于所有参数类型-请参见this GitHub issue


如果您只是想在运行时 防止交互式提示,请通过以{{ 1}}

-noninteractive

这样,您的脚本不会提示并报告一个 error ,该错误指示了(第一个)必需参数的名称。没有提供任何论据。

注意事项:启用默认错误处理后,脚本执行仍会继续;设置powershell.exe -noninteractive -file C:\path\to\pingtest.ps1 可以防止这种情况。


如果要 在设计时确定哪些参数是必需的,请使用
$ErrorActionPreference = 'Stop'

>

如果必要且可用,请补充Get-Command <command> -Syntax(或Get-Help -Detailed <command>)或-Full,以了解有关参数的详细信息。
但是请注意,自定义脚本和功能可能没有与之关联的帮助信息。

PowerShell的语法图并不是最容易理解的语法,但是它们确实告诉您哪些参数是必需的。

Get-Help -Parameter <parameterName> <command> cmdlet为例:

Get-Item
  • 每条输出线代表一个不同的参数集

    • 哪些参数将一个参数集与另一个参数区分开尚不清楚。在这种情况下,这是PS> Get-Command Get-Item -Syntax Get-Item [-Path] <string[]> [-Filter <string>] [-Include <string[]>] [-Exclude <string[]>] [-Force] [-Credential <pscredential>] [-UseTransaction] [-Stream <string[]>] [<CommonParameters>] Get-Item -LiteralPath <string[]> [-Filter <string>] [-Include <string[]>] [-Exclude <string[]>] [-Force] [-Credential <pscredential>] [-UseTransaction] [-Stream <string[]>] [<CommonParameters>] -Path的比较,这是与提供程序相关的cmdlet常见的情况。
  • 在给定的参数集中, {em> 内的{em> 两者参数 name (例如-LiteralPath)和参数 type (例如[...]是强制性的

    • 如果在-LiteralPath 中仅包含参数 name (例如<string[]>),则该参数也是强制性的,但是可以按位置 指定参数-也就是说,您可以省略参数名称,仅指定 argument (要绑定的值参数);例如,您可以只指定
      [...]而不是
      [-Path]

基于上述内容,掌握了以下信息:

  • 您将要使用的参数集
  • 其强制参数是什么

然后,您可以通过为所有必需参数提供参数的方式来调用命令,从而避免出现交互式提示。