【发布时间】:2017-09-08 14:49:54
【问题描述】:
我知道如何将开关参数添加到 PowerShell 脚本,但开关的名称始终是一个(有效)标识符,例如 -Enable,因为该名称是从支持 PowerShell 变量生成的。
[CmdletBinding()]
param(
[switch] $Enable = $false
)
有些工具有-2008 之类的开关。通常,人们会将开关命名为$2008,但这不是一个有效的标识符。
如何在 PowerShell 中将这种开关实现为布尔值? 或者换句话说:如何指定与支持变量不同的参数名称?
编辑 1
我不知道只有数字的变量(这对于编程语言来说很奇怪......)。无论如何,我创建了这个例子:
function foo
{ [CmdletBinding()]
param(
[switch] $2008
)
Write-Host "2008=$2008"
}
对于这个被接受为有效 PowerShell 的代码,我会根据需要获得自动完成。但是在提供该参数时,我收到以下错误消息:
foo : Es wurde kein Positionsparameter gefunden, der das Argument "-2008" akzeptiert.
In Zeile:1 Zeichen:1
+ foo -2008
+ ~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [foo], ParameterBindingException
+ FullyQualifiedErrorId : PositionalParameterNotFound,foo
翻译:没有找到接受参数“-2008”的位置参数。
脚本的目的是为命令行界面提供翻译/包装。
这是一组带参数的标准化可执行文件:
vcom.exe -2008 design.vhdl
vsim.exe -2008 design
翻译:
ghdl.exe -a --std=2008 design.vhdl
ghdl.exe -e --std=2008 design
ghdl.exe -r --std=2008 design
我想保留参数自动完成的功能,否则我可以处理所有剩余的参数并手动翻译它们。
【问题讨论】:
-
我不明白,你想让开关名称完全是
$true吗? -
通常,您会将开关命名为
$2008,但这不是有效的标识符。那么如何指定与后备变量不同的参数名称呢? -
这是不允许的,因为它在解析负整数时会产生歧义 --
-2008是未命名参数的值还是名为2008的开关?我并不不满 PowerShell 只允许前者。如果这些开关在您的上下文中有意义,请考虑调整它们以使它们 有效——例如-Y2008如果它应该是年份,-W2008如果它应该启用警告等等。 -
很有趣,如果你这样喷它就可以了,
$p=@{2008=$true}, function @p,你甚至不需要 ${2008},$2008 也可以 -
@JeroenMostert 当然,这是有道理的。我可能会选择具有有限
ValidateSet属性的string(或string[],如果值不是互斥的)参数。顺便说一句,您应该添加一个答案
标签: powershell parameter-passing powershell-cmdlet