powershell - 防止脚本中参数值的交互式提示
问题描述
我有一个脚本,pingtest.ps1
它进行以下调用:
Start-abc -SourceIpaddress x.y.x.z -Protocol TCP -DestinationIpAddress a.c.d.e
在执行期间,它会提示输入源端口和目标端口。
如何避免这些交互式提示,而是在同一脚本中传递值?
解决方案
tl;博士
在您的调用中添加类似-SourcePort 42
and的内容应该会阻止这些交互式提示(当然,您必须提供适当的值来代替示例值并在此处使用)。-DestinationPort 666
Start-abc
42
666
要确定这些参数的确切名称和背景信息,请继续阅读。
如果命令的调用没有为其所有强制参数提供参数(需要值才能使命令运行的参数):
- PowerShell 通过设计交互式提示这些参数,
- 并且仅当您提供所有必需的参数(使用有效值)时,该命令才会真正执行。
注意:这种提示机制在实践中很少使用,并且不适用于所有参数类型 - 请参阅此 GitHub 问题。
如果您只是想在运行时阻止交互式提示,请通过以以下方式启动的新PowerShell 实例-noninteractive
运行您的命令:
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
vs.-LiteralPath
,这对于提供程序相关的 cmdlet 很常见。
- 哪些参数将一个参数集与另一个参数集区分开来并不明显。在这种情况下,它是
在给定的参数集中,任何未包含在
[...]
整体中的参数(围绕参数名称(例如,-LiteralPath
)和参数类型(例如,<string[]>
))都是强制性的。- 如果仅将参数名称包含在
[...]
(例如,[-Path]
)中,则该参数也是必需的,但可以按位置指定参数- 也就是说,您可以省略参数名称并仅指定参数(绑定到参数的值);例如,Get-Item -Path foo.txt
您可以只指定Get-Item foo.txt
.
- 如果仅将参数名称包含在
基于以上信息,掌握以下信息:
- 您将使用哪个参数集
- 它的强制参数是什么
然后,您可以以一种为所有强制参数提供参数的方式调用您的命令,从而避免交互式提示。
推荐阅读
- reactjs - 在 React 函数中获取和排序
- css - Angular 2+:使用带有函数的 NgStyle 时如何重载背景图像
- json - 无法识别的令牌'object':在 [Source: (String)"[object Object]" 处期待 ('true', 'false' 或 'null')↵;行:1,列:8]
- kotlin - Kotlin:tailrec 让暂停的乐趣永无止境
- react-native - 如何像 instagram 一样实现模态向下滑动?
- r - 使用行的差异创建新列
- php - 在数字前后添加空格
- html - 网格对齐水平中心不起作用
- sas - 确定治疗强化日期
- language-agnostic - 其他编程语言上的魔术方法