防止脚本中的参数值的交互式提示

问题描述 投票:-1回答:1

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

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

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

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

powershell syntax parameter-passing prompt non-interactive
1个回答
0
投票

tl;博士

在你的-SourcePort 42调用中添加-DestinationPort 666Start-abc之类的东西应该可以防止这些交互式提示(当然你必须提供适当的值来代替这里使用的样本值42666)。

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


如果命令的调用不提供其所有必需参数的参数(为了使命令运行而需要值的参数):

  • PowerShell按设计交互式提示这些参数,
  • 并且只有在您提供所有必需参数(使用有效值)时,该命令才会实际执行。

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


如果您只是想在运行时阻止交互式提示,请通过以-noninteractive开头的新PowerShell实例运行命令:

powershell.exe -noninteractive -file C:\path\to\pingtest.ps1

这样,您的脚本将不会提示并报告错误,而是指示未提供参数的(第一个)必需参数的名称。

警告:有效的默认错误处理,脚本执行仍将继续;设置$ErrorActionPreference = 'Stop'会阻止这种情况。


如果要在设计时确定哪些参数是必需的,请使用 Get-Command <command> -Syntax

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

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

使用Get-Item cmdlet作为示例:

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-LiteralPath,这对于提供者相关的cmdlet是常见的。
  • 在给定的参数集中,任何未作为整体包含在[...]中的参数(围绕参数名称(例如,-LiteralPath)和参数类型(例如,<string[]>))都是强制性的。 如果参数名称仅包含在[...]中(例如,[-Path]),则该参数也是必需的,但参数可以在位置上指定 - 也就是说,您可以省略参数名称并仅指定参数(要绑定到参数的值) );例如,而不是 你可以指定Get-Item -Path foo.txt Get-Item foo.txt

基于以上所述,武装的信息如下:

  • 您将使用哪个参数集
  • 它的强制性参数是什么

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

© www.soinside.com 2019 - 2024. All rights reserved.