san*_*ica 3 parameters powershell function variadic-functions
我是 PowerShell 的新手。在 Msys2(或 Lnux)中,我定义了一个函数npp
npp ()
{
${NPP_PATH} "$@"
}
Run Code Online (Sandbox Code Playgroud)
这样,如果我从命令提示符调用,npp它会启动 Notepad++(如 中所定义${NPP_PATH})。如果我调用npp "mydir/stage 1/a.txt"它会打开该文件进行编辑。一般来说,它允许:
PowerShell 中的等价物是什么?
我想在 PS 我也应该去寻找一个函数来获得类似的行为。到目前为止,我可以接收未定义数量的参数,并在foreach循环中使用它们,请参阅下面的代码。但是我找不到简单的等价物"$@"来传递接收到的所有参数。此外,如果我在其中一个参数中使用引号,它们将被删除,因此文件路径可能会出现问题,包括空格。
function multi_params {
param(
[Parameter(
ValueFromRemainingArguments=$true
)][string[]]
$listArgs
)
$count = 0
foreach($listArg in $listArgs) {
'$listArgs[{0}]: {1}' -f $count, $listArg
$count++
}
}
Run Code Online (Sandbox Code Playgroud)
假设这NPP_PATH是一个环境变量,等效的 PowerShell 函数是:
function npp {
& $env:NPP_PATH $args
}
Run Code Online (Sandbox Code Playgroud)
如果NPP_PATH是常规 PowerShell 变量的名称,请使用& $NPP_PATH $args.
&是调用运算符,出于语法原因,每当您想调用名称/路径在引号中和/或通过变量指定的命令时,都需要它。
在像上面这样的简单函数(与高级函数相反)中(不使用[CmdletBinding()]也不使用 [Parameter()]属性),您可以使用自动$args变量将任何参数传递给另一个命令。
如果目标命令不是外部程序(例如此处),而是PowerShell命令,请使用该表单@args来确保所有参数 - 包括其参数名称前面的参数- 都正确传递 - 请参阅about_Splatting。
请注意,该表单也@args适用于外部程序,它通常等效于$args(唯一的区别是仅@args识别和删除--%,停止解析符号)
请注意,传递带有嵌入"字符的参数。和空参数到外部程序仍然是断开的PowerShell的V7.0的-看到这个答案。
仅在简单函数中,$args包含调用时未绑定到声明参数的所有参数(如果有)。
如果您的简单函数没有声明任何参数,如上例所示,则$args包含调用时传递的所有参数。
如果您的简单函数确实声明了参数(通常通过param(...)),则$args仅包含那些未绑定到声明参数的参数;简而言之:它收集您的函数未为其声明参数的任何参数。
因此,$args是一种收集未事先声明或已知的参数的简单机制,或者用于函数本身 - 特别是如果声明参数不值得付出努力 - 或者将这些参数传递给另一个命令。
要将包含命名参数(例如,-Path foo而不仅仅是foo)的参数传递给另一个 PowerShell 命令,需要使用splatting,即@args.
$args技术上是一个常规的 PowerShell 数组 ( [object[]]),但它也具有支持传递命名参数的内置魔法;一个自定义的阵列可以不被用于此,并且哈希表,然后需要的泼洒形式-见about_Splatting在先进的功能,$args是没有用的,因为根据定义高级功能只接受其参数已经声明的参数。
要接受额外的仅位置参数,您必须定义一个包罗万象的ValueFromRemainingArguments参数,如问题所示,默认情况下,该参数将此类参数收集在类似数组的[1]数据结构中。
要还支持命名传递参数,您有两个基本选项:
如果您知道潜在的传递参数集,请将它们声明为您自己的函数的一部分。
$PSBoundParameters字典(哈希表)的splatting - 见下文 - 传递命名参数,可能在从字典中删除用于您的函数本身的参数之后。在为现有命令编写代理(包装器)函数时使用此技术;PowerShell SDK 允许您根据现有命令构建代理功能,从而更容易复制传递参数- 请参阅此答案。
否则,只有一个次优的解决方案,您可以模拟 PowerShell 自己的参数解析来将位置参数解析为参数-名称/值对 - 请参阅此答案。
该自动$PSBoundParameters变量是一个字典,在提供既简单又先进的功能:
$PSBoundParameters仅当您的函数声明参数时才适用,并且仅包含在调用时实际绑定(传递)参数的声明参数中的条目;字典键是参数名称,尽管没有初始-.
需要注意的是约束参数由默认值是不包括-看到这个问题的GitHub的讨论。
再次注意,在高级函数中,如果为给定参数声明了参数,则只能传递给定参数,因此在给定调用中传递的任何参数根据定义都反映在$PSBoundParameters.
因为它是一个字典(哈希表),所以它可以与基于哈希表的 splatting 一起使用@PSBoundParameters- 将命名参数传递给其他 PowerShell 命令,并且由于它是可变的,您可以选择添加或删除命名参数(例如作为用于您的功能本身的那些)。
[1]那种类型是[System.Collections.Generic.List[object]]; 但是,您可以显式指定集合类型,例如[object[]]获取常规 PowerShell 数组。
| 归档时间: |
|
| 查看次数: |
1309 次 |
| 最近记录: |