我有一个脚本pingtest.ps1,它执行以下调用:
pingtest.ps1
Start-abc -SourceIpaddress x.y.x.z -Protocol TCP -DestinationIpAddress a.c.d.e
在执行过程中,它会提示输入源端口和目标端口。如何避免这些交互式提示,而是在同一脚本中传递值?
relj7zay1#
tl;dr
在Start-abc调用中添加-SourcePort 42和-DestinationPort 666之类的东西应该可以阻止这些交互式提示(当然,您必须提供适当的值来代替这里使用的示例值42和666)。要确定这些参数的确切名称和背景信息,请继续阅读。如果调用命令时没有为其所有 mandatory 参数(需要值才能执行命令的参数)提供参数:
Start-abc
-SourcePort 42
-DestinationPort 666
42
666
注意:这种提示机制在实践中很少使用,并且不适用于所有参数类型-参见GitHub issue #4068。如果您只是想 * 防止 * 运行时 * 的交互式提示,请通过新的以-noninteractive启动的PowerShell示例运行您的命令:
-noninteractive
powershell.exe -noninteractive -file C:\path\to\pingtest.ps1
这样你的脚本**就不会 * 提示 ,而是报告一个 error,它指出了没有提供参数的(第一个)强制参数的名称。
警告:默认错误处理生效,脚本执行仍 * 继续 *;设置$ErrorActionPreference = 'Stop'可以防止这种情况。
$ErrorActionPreference = 'Stop'
如果要 * 在设计时 * 确定哪些参数是必需的**,请使用
Get-Command <command> -Syntax。
Get-Command <command> -Syntax
如有必要且可用,请补充Get-Help -Detailed <command>(或-Full)或Get-Help -Parameter <parameterName> <command>以了解有关参数的详细信息。但是,请注意,自定义脚本和函数可能没有与其关联的帮助信息。PowerShell的语法图(在概念性的about_Command_Syntax帮助主题中有记录)并不容易破译,但它们确实告诉您哪些参数是必需的。以Get-Item cmdlet为例:
Get-Help -Detailed <command>
-Full
Get-Help -Parameter <parameterName> <command>
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
-LiteralPath
[...]
<string[]>
[-Path]
Get-Item -Path foo.txt您可以只指定Get-Item foo.txt .基于上述情况,根据以下信息:
Get-Item -Path foo.txt
Get-Item foo.txt
然后,您可以以向所有强制参数提供参数的方式调用命令,从而避免交互式提示。
1条答案
按热度按时间relj7zay1#
tl;dr
在
Start-abc
调用中添加-SourcePort 42
和-DestinationPort 666
之类的东西应该可以阻止这些交互式提示(当然,您必须提供适当的值来代替这里使用的示例值42
和666
)。要确定这些参数的确切名称和背景信息,请继续阅读。
如果调用命令时没有为其所有 mandatory 参数(需要值才能执行命令的参数)提供参数:
注意:这种提示机制在实践中很少使用,并且不适用于所有参数类型-参见GitHub issue #4068。
如果您只是想 * 防止 * 运行时 * 的交互式提示,请通过新的以
-noninteractive
启动的PowerShell示例运行您的命令:这样你的脚本**就不会 * 提示 ,而是报告一个 error,它指出了没有提供参数的(第一个)强制参数的名称。
警告:默认错误处理生效,脚本执行仍 * 继续 *;设置
$ErrorActionPreference = 'Stop'
可以防止这种情况。如果要 * 在设计时 * 确定哪些参数是必需的**,请使用
Get-Command <command> -Syntax
。如有必要且可用,请补充
Get-Help -Detailed <command>
(或-Full
)或Get-Help -Parameter <parameterName> <command>
以了解有关参数的详细信息。但是,请注意,自定义脚本和函数可能没有与其关联的帮助信息。
PowerShell的语法图(在概念性的about_Command_Syntax帮助主题中有记录)并不容易破译,但它们确实告诉您哪些参数是必需的。
以
Get-Item
cmdlet为例:*每一个输出行代表一个**不同的 * 参数集 *。
-Path
与-LiteralPath
,这对于提供程序相关的cmdlet是常见的。[...]
* 作为一个整体*(围绕 * 参数 * 名称 *(例如,-LiteralPath
)和参数 * 类型 (例如,<string[]>
))是 * 强制。[...]
中只包含参数 name(例如[-Path]
),则该参数也是**强制性的,但参数可以 * 按位置 * 指定-也就是说,您可以 * 省略参数名称 *,只指定 * 参数 *(绑定到参数的值);例如,代替Get-Item -Path foo.txt
您可以只指定Get-Item foo.txt
.基于上述情况,根据以下信息:
然后,您可以以向所有强制参数提供参数的方式调用命令,从而避免交互式提示。