![如何创建包含选项的 PowerShell 别名(或函数)?](https://linux22.com/image/1708531/%E5%A6%82%E4%BD%95%E5%88%9B%E5%BB%BA%E5%8C%85%E5%90%AB%E9%80%89%E9%A1%B9%E7%9A%84%20PowerShell%20%E5%88%AB%E5%90%8D%EF%BC%88%E6%88%96%E5%87%BD%E6%95%B0%EF%BC%89%EF%BC%9F.png)
我正在学习 PowerShell,所以我经常做这样的事情:
Get-Command | Out-String -Stream | ss child
(ss
是 的别名select-string
)。
我对一直打字感到厌倦Out-string -Stream
,所以在 Unix 中我只需为其创建一个别名即可。然而这在 Powershell 中不起作用。
- 我将其创建为别名,但出现错误(我想我明白这一点)。
- 我将其创建为一个函数,但它吞噬了我所有的输出
- 我将其创建为一个过滤器,但也没有产生任何输出。
我怎样才能做到这一点?
使用 *child* 作为参数可能是完成此特定任务的最佳方法,但我实际上是以此为示例来学习如何编写 PS 函数。
我只是想要用这个函数来替换“Out-string -Stream”部分,这样就可以了:
Get-Command | Out-String -Stream | ss child
我将能够写:
Get-Command | oss | ss child
我猜我需要使用 ValueFromPipeline 或者 $input 变量,就像 Matt 所展示的那样。
好的,我明白了。我想我需要明确说明从管道读取。而不是:
function oss { Out-String -Stream }
我需要说的是:
function oss { $input | Out-String -Stream }
我不知道我怎么会在文档中错过这个?
答案1
一个函数吞噬了所有的输出,这是什么意思?
我尝试了这个并得到了相同的输出:
function MySS {
[cmdletbinding()]
param (
[string] $SearchString
)
Process {
Get-Command | Out-String -Stream | Select-String -Pattern $SearchString
}
}
在输出上运行 Get-Member 和 GetType 返回与函数和管道命令相同的形式。
编辑:如果你想要我们其他原始功能
function MySS2 {
[cmdletbinding()]
param (
[Parameter(
Mandatory = $True,
ValueFromPipeline = $true)]
$input,
[Parameter(
Mandatory = $True,
ValueFromPipeline = $false,
Position = 0)]
[string] $SearchString
)
Process {
$input | Out-String -Stream | Select-String -Pattern $SearchString
}
}
例如
Get-Command | MySS2 "Get"
get-help get-alias | MySS2 "Get"
编辑:最简单的形式(选择注释掉的字符串):
function MyOSS {
param ($input)
$input | Out-String -Stream #| Select-String "Get"
}
编辑:我认为是最终编辑!:-)
我看到你自己已经搞清楚了,Jonathan - 很高兴能帮到你,我不知道你可以使用 $input 而不将其声明为参数。太棒了。
答案2
仅供参考:
我一直在使用这个
grep
替换函数,只要我一直在使用 PowerShell:function grep { $input | out-string -stream | sls $args }
Select-String
当前版本的 PowerShell(>=3.0)既有( )的别名,也有( )sls
的快捷函数。也有自己的别名,。 因此,命令的标准缩写形式是Out-String -Stream
oss
Get-Command
gcm
gcm | oss | sls child
Get-Command
的参数中允许使用通配符name
,这意味着gcm *child*
基本上可以做到这一点(当然速度要快得多)