PowerShell:args 和命名参数

Mar*_* M. 1 powershell parameter-passing args

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

param (
    [switch]$CreateShortcut
)
Run Code Online (Sandbox Code Playgroud)

开关参数起作用。

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

param (
    [switch]$CreateShortcut,
    [string]$Param1
)
Run Code Online (Sandbox Code Playgroud)

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

有解决办法吗?

谢谢

mkl*_*nt0 5

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

PowerShell 允许您在单个数组值参数中收集此类未命名参数,方法是将其声明为ValueFromRemainingArguments

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

    • 这对于支持参数来说不是必需的[switch],因为它们只是隐式命名的,但它允许您支持[switch]可以通过显式调用(仅)绑定的附加非参数。
  • 或者,如果您不需要支持其他预声明的非开关参数,则可以省略 [CmdletBinding(PositionalBinding=$false)]参数声明并通过自动变量$FilesOrFolders访问不绑定到预声明参数的任何参数。$args

    • [Parameter()]一般来说,请注意,在任何预先声明的参数上使用属性都会导致$args不可用,就像 的存在[CmdletBinding()]一样。

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

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