如何创建包含选项的 PowerShell 别名(或函数)?

如何创建包含选项的 PowerShell 别名(或函数)?

我正在学习 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 -StreamossGet-Commandgcmgcm | oss | sls child

  • Get-Command的参数中允许使用通配符name,这意味着gcm *child*基本上可以做到这一点(当然速度要快得多)

相关内容