powershell - 使 Powershell 函数在流水线和正常调用中都能正常工作
问题描述
假设我有以下 Powershell 功能:
function AddGos
{
[CmdletBinding()]
param
(
[Parameter(ValueFromPipeline=$True)]
[string[]] $dbScript
)
process
{
$dbScript + "GO"
}
}
如果我这样称呼它:
("one", "two", "three") | AddGos
我得到:
一
去
二
去
三
去
但如果我这样称呼它:
AddGos("one", "two", "three")
然后我得到这个:
一
二三 去
_
这是因为当您作为管道运行时,它会分解我的数组并process
为数组中的每个条目调用该部分。但是当您通常调用它时,它只是作为单个对象传入数组。
我可以看到一种使这个简单场景同时支持这两种情况的方法,但是当您开始获得复杂的功能时,它很快就会变得过于复杂,无法同时管理这两种情况。
这在 Powershell 世界中通常是如何处理的?
功能的含义仅支持一种方式或另一种方式?还是有一些简单的方法可以解决我缺少的这个问题?还是函数作者真的很努力地让它工作?
解决方案
在流程块中添加一个foreach
循环来处理这两种情况:
function AddGos {
[CmdletBinding()]
param (
[Parameter(ValueFromPipeline=$True)]
[string[]] $dbScript
)
process {
foreach ($item in $dbScript) {
$item + "`r`nGO"
}
}
}
"one", "two", "three" | AddGos
AddGos "one", "two", "three"
这两个调用现在都会给你相同的结果:
one GO two GO three GO
PS你不需要数组元素周围的括号
推荐阅读
- javascript - 收集文本输入信息并将其发布到 php 文档中。使用方法获取
- go - 添加 3 个方法或一个通用方法
- windows - 打开串口 CMD
- javascript - 样式化 Reactstrap 单选按钮
- javascript - 如何动态更改html元素的值?
- perl - 如何使用 App::Cmd 模块实现子命令?
- excel - 调整图片宽度和高度
- javascript - 使用变量源时无法将属性“src”设置为 null
- php - SQL 查询返回整个表而不是单行
- oracle - 为什么我的 sqlplus 字符串连接仅适用于 /service_name 而不适用于 :service_name