gpt4 book ai didi

powershell - 如何在不破坏 Powershell 中的流水线的情况下使用绑定(bind)参数 "alias"?

转载 作者:行者123 更新时间:2023-12-02 23:53:00 25 4
gpt4 key购买 nike

我发现自己经常跟|select -first 10到命令的末尾,我想将其缩短为 |s10 , |s50 ,以及其他几个变体。所以我想做相当于 set-alias s10 select-object -first 10 .

使用绑定(bind)参数“别名”的标准方法是编写一个函数并转发 @args 以及额外的参数。但是,如果我编写一个管道函数 $input通过select-object ,我失去了流媒体。

我可以编写一个开始/处理/结束函数,但我不知道是否/如何将它们中的每一个转发到 select-object 中的等价物。我可以编写自己的 select-object 的 begin/process/end 实现,它只实现了 -first 行为,但那是错误的......

(我的后备方案是添加一个制表符补全来扩展 s10,但我真的更想学习如何实现正确的功能。)

如何实现转发到 select-object 的功能带有我要添加但不破坏流水线的参数?

最佳答案

我找到了这个来源 https://blogs.technet.microsoft.com/heyscriptingguy/2011/03/01/proxy-functions-spice-up-your-powershell-core-cmdlets/

在这种情况下,Select-String -First 10 的快捷方式/别名可以归结为:

$metadata = New-Object System.Management.Automation.CommandMetaData (Get-Command Select-Object)
[System.Management.Automation.ProxyCommand]::Create($MetaData) | Out-File -FilePath prxyfunctions.psm1

打开 prxyfunctions.psm1 模块文件,将完整内容包装在名为 S10 的新函数中
function S10 {
[CmdletBinding(DefaultParameterSetName = 'DefaultParameter', HelpUri = 'https://go.microsoft.com/fwlink/?LinkID=113387', RemotingCapability = 'None')]
param(

<abbreviated...>

.ForwardHelpTargetName Microsoft.PowerShell.Utility\Select-Object
.ForwardHelpCategory Cmdlet

#>
}

然后在 Begin{} 部分添加一条语句 $PSBoundParameters.Add('First','10')如下所示。
begin {
try {
$outBuffer = $null
if ($PSBoundParameters.TryGetValue('OutBuffer', [ref]$outBuffer)) {
$PSBoundParameters['OutBuffer'] = 1
}
$PSBoundParameters.Add('First','10')
$wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Microsoft.PowerShell.Utility\Select-Object', [System.Management.Automation.CommandTypes]::Cmdlet)
$scriptCmd = {& $wrappedCmd @PSBoundParameters }
$steppablePipeline = $scriptCmd.GetSteppablePipeline($myInvocation.CommandOrigin)
$steppablePipeline.Begin($PSCmdlet)
}
catch {
throw
}
}

就是这样。保存文件,导入模块,输入一个漂亮的短命令,如 gci c:\|s10只得到 10 个结果。
如果你真的想让事情防错,就需要更多的编码。如果 S10 -First 2使用你会得到一个很好的错误。

编辑 回应@PetSerAl 的有用评论

管道中的某些 cmdlet 可能无法处理代理函数,例如 Sort-Object。比较这两行的输出
-join (20..1 | Select -First 10 | Sort)
11121314151617181920

-join (20..1 | S10 | Sort)
<nothing>

-join (20..1 | S10 -Wait | Sort)
11121314151617181920

可以通过在命令行上使用 -Wait 参数来解决这个问题。或者在代理函数中编码Wait参数 $PSBoundParameters.Add('Wait',$true)
在处理大型集合时,这是不幸的,因为它禁用了在 x 个元素之后停止管道的 Select-Object 功能,从而导致更多的处理和更长的等待时间。

关于powershell - 如何在不破坏 Powershell 中的流水线的情况下使用绑定(bind)参数 "alias"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54265476/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com