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
.
我有一个从 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
.