PowerShell中外部命令的默认选项

时间:2018-01-23 17:54:39

标签: powershell

我想通过将默认选项grep应用于-i来使grep不区分大小写。 PowerShell中的标准方法是使用函数:

function grep {
    env grep -i $args
}

Grep也接受通过标准输入(cat file | grep search)进行搜索的文字。

实现这一目标的一个简单方法是:

function grep($search) {
    $input | env grep -i $search

我可以将这两个结合起来,以便函数grep知道它是在管道中调用的吗?或者有更简单的方法吗?

2 个答案:

答案 0 :(得分:0)

我将假设env grep意味着您拥有一个带有grep.exe的Unix -ish 环境。在一个可以处理参数管道输入的函数中包装它的正确方法看起来像这样:

function grep {
    [CmdletBinding(DefaultParameterSetName='content')]
    Param(
        [Parameter(Position=0,Mandatory=$true)]
        [string]$Search,

        [Parameter(
            ParameterSetName='content',
            Mandatory=$true,
            ValueFromPipeline=$true,
            ValueFromPipelineByPropertyName=$true
        )]
        [string]$InputObject,

        [Parameter(
            ParameterSetName='file',
            Position=1,
            Mandatory=$true
        )]
        [string[]]$File
    )

    Begin {
        $grep = & env grep
    }

    Process {
        if ($PSCmdlet.ParameterSetName -eq 'file') {
            & $grep -i $Search $File
        } else {
            $InputObject | & $grep -i $Search
        }
    }
}

答案 1 :(得分:0)

我终于明白了。这可能只能以交互方式工作,而不能在脚本中工作 - 因为$input - 但是别名通常被认为是一种交互式技术(尽管不一定为命令提供标准选项)。

在这个例子中,我使用ag - Silver Searcher - 因为它不区分大小写(实际上是“case-smart”),递归并默认启用颜色。如果没有给出路径,它会搜索当前目录(这是第一个显示函数按预期工作的“测试用例”)

function ag {
    if ($input.Count) {
        $input.Reset()
        $input | env ag -i $args
    }
    else {
        env ag --depth -1 --hidden --skip-vcs-ignores $args
    }
}

enter image description here