PowerShell:args 和命名参数

PowerShell : args and named parameter

我有一个从 Windows 快捷方式调用的 PS 脚本。我在上面放了几个文件或目录,它工作正常。 我想添加一些命名参数(让我们称它们为:-Param1 和 -Param2),可选的,可以使用,当然,只能从 PowerShell 提示符中使用。

param (
    [switch]$CreateShortcut
)

开关参数有效。

但是,如果我添加一个字符串参数:

param (
    [switch]$CreateShortcut,
    [string]$Param1
)

当然,当我通过 Windows 快捷方式调用我的脚本时,它不再起作用:$Param1 接收第一个文件。

有解决办法吗?

谢谢

当您将 files/folders 放在快捷方式文件上时,它们的完整路径将 作为单独的未命名参数传递 到快捷方式的可执行文件(脚本)。

PowerShell 允许您在单个数组值参数[=64= 中收集 此类未命名参数], 通过将其声明为 ValueFromRemainingArguments:

[CmdletBinding(PositionalBinding=$false)]
param (
    [switch] $CreateShortcut,
    # Collect all unnamed arguments in this parameter:
    [Parameter(ValueFromRemainingArguments)]
    [string[]] $FilesOrFolders
)
  • [CmdletBinding(PositionalBinding=$false)] 确保任何未明确标记为 Position 属性 的参数必须作为 named 参数传递(即,参数前面必须有目标参数的名称,例如 -Path foo)。

    • 这不是支持 [switch] 参数所必需的,因为它们 隐式 仅命名,但它允许您支持其他非 [switch] 可以通过显式调用(仅)绑定的参数。
  • 或者,如果您不需要支持额外的预先声明的非开关参数,您可以省略[CmdletBinding(PositionalBinding=$false)]$FilesOrFolders 参数声明并访问任何未通过 automatic $args variable.

    绑定到预声明参数的参数
    • 一般来说,请注意,在任何预先声明的参数上使用 [Parameter()] 属性会使 $args 不可用,因为 [CmdletBinding()] 的存在。

    • 原因是使用任一属性使脚本或函数成为 advanced 一个,即使其成为 cmdlet-like,因此不允许传递未绑定到声明参数的参数;换句话说:$args 根据定义总是 empty(一个空数组)。

    • 高级脚本或函数自动获得附加功能,特别是对 common parameters 的支持,例如 -Verbose.