【问题标题】:How to add a numeric switch to a PowerShell script如何将数字开关添加到 PowerShell 脚本
【发布时间】: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


【解决方案1】:

PowerShell 不支持数字参数(请参阅this answer)。

验证集是否可以解决您的问题?

验证集确实受益于自动完成功能,在我看来,这是你想要的下一个最好的东西。

Foo 和 Foos — 两者相同,只是 Foos 接受多个参数。

foo -std 2008
foos -std 2008,2009,2010





    function foo
{ [CmdletBinding()]
  param(
    [ValidateSet("2008",
                 "2009",
                 "2010",
                 "2011","2012")][INT]$std
  )
  Write-Host "std:$std"
}

function foos
{ [CmdletBinding()]
  param(
    [ValidateSet("2008",
                 "2009",
                 "2010",
                 "2011","2012")][INT[]]$std
  )
  $std | foreach {Write-Host "std: $_"}
}





foo -std 2008
foos -std 2008,2009,2010

【讨论】:

  • 原始程序例如vcom 在版本号前面没有-std 开关。更多的 - 不见了。所以我认为我需要使用另一种解决方案,例如带有ArgParse 的 Python 脚本。
  • 如果它是真正的 exe 的包装器,你不能在之后使用 &"YourWrappedapp.exe -$std" 调用它,这样你就可以有效地使用 foo -std 2008 来调用 "YourWrappedApp.exe -2008”?还是我错过了什么?。
  • 包装器(用 PowerShell 编写)应模拟vcom 的接口,因此它必须提供-2008 开关。如果在包装器上设置了-2008,它将在内部使用开关--std=2008 调用ghdl.exe。目的是现有的 vcom/vlib/vsim 调用的模拟器脚本可以重新用于 GHDL 模拟器,它使用不同的 CLI,但提供相同的命令(分析、详细说明、运行模拟)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 2022-10-17
  • 2016-10-26
相关资源
最近更新 更多