gpt4 book ai didi

powershell - 在Powershell中延迟执行管道?

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

是否可以延迟管道执行或修改先前的管道?我正在寻找的是与ODATA端点进行交互的能力。我想使用标准(或自定义)powershell命令来过滤数据,但是我不想检索整个列表。例如

function Get-Records() {
Invoke-RestMethod -Method Get -Uri $endpoint.Uri.AbsoluteUri ...
}

调用此方法可能会返回500多个记录。通常,有时我不想检索所有500条记录。因此,如果我需要全部500个,我可能只调用 Get-Records。但是,如果我只想要特定的代码,我就想做

Get-Records | Where {$_.Name -eq 'me'}

上面仍然接收所有500条记录,然后将其过滤。我将以某种方式希望 Where {$_.Name -eq 'me'}传递回上一个管道,将过滤器传递给 Invoke-RestMethod并附加到URI $filter=Name eq 'me'

最佳答案

您不能通过诸如Where-Object之类的后处理过滤器追溯地修改管道。

而是,您必须使用数据提供程序的语法在源处进行过滤。

这就是PowerShell的内置cmdlet(例如Get-ChildItem)如何通过[string]类型的-Filter参数实现的。

如果要通过PowerShell脚本块作为过滤器,则必须自己将其转换为提供程序的语法-可能的话

几乎不会将PowerShell表达式与提供程序的过滤功能进行一对一映射,因此也许更好的方法是要求用户直接使用提供程序的语法:

function Get-Records() {
param(
[Parameter(Mandatory)]
[uri] $Uri
,
[string] $Filter # Optional filter in provider syntax; e.g. "Name eq 'me'"
)
if ($Filter) { $Uri += '?$filter=' + $Filter }
Invoke-RestMethod -Method Get -Uri $uri
}

# Invoke with a filter in the provider's syntax.
Get-Records "Name eq 'me'"

如果您确实希望用户能够传递脚本块,则必须对提供程序语法进行自己的翻译,并确保可以进行翻译。

为了稳健地执行此操作,您必须处理脚本块的AST(抽象语法树),可以通过其 .Ast 属性访问它,这是不平凡的。

如果您愿意对允许用户传递的表达式类型进行假设,则可以使用字符串解析,例如下面的简单示例:
function Get-Records {
param(
[Parameter(Mandatory)]
[uri] $Uri
,
[scriptblock] $FilterScriptBlock # Optional filter
)
if ($FilterScriptBlock) {
# Translate the script block' *string representation*
# into the provider-native filter syntax.
# Note: This is overly simplistic in that it simply removes '$_.'
# and '-' before '-eq'.
$Uri += '?$filter=' + $FilterScriptBlock -replace '\$_\.' -replace '-(?=[a-z]+\b)'
}
Invoke-RestMethod -Method Get -Uri $Uri
}

# Invoke with a filter specified as a PowerShell script block.
Get-Records { $_.Name -eq 'me' }

关于powershell - 在Powershell中延迟执行管道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59517573/

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