gpt4 book ai didi

powershell - 管道语义不会传播到 Where-Object

转载 作者:行者123 更新时间:2023-12-03 23:31:31 24 4
gpt4 key购买 nike

我使用以下命令来运行管道。

.\Find-CalRatioSamples.ps1 data16 `
| ? {-Not (Test-GRIDDataset -JobName DiVertAnalysis -JobVersion 13 -JobSourceDatasetName $_ -Exists -Location UWTeV-linux)}

第一个是我的自定义脚本,运行速度非常快(毫秒)。第二个是自定义命令,也是我写的(参见 https://github.com/LHCAtlas/AtlasSSH/blob/master/PSAtlasDatasetCommands/TestGRIDDataset.cs )。它非常慢。

实际上,处理每一行输入并没有那么慢。可以处理第一行输入之前的设置非常昂贵。然而,完成后,它进行得相当快。因此,所有昂贵的代码都只执行一次,并且只需要为每个新的管道输入执行相当快的代码。

不幸的是,当我想做 ? { } 上面的构造,似乎 PowerShell 没有像以前那样保留管道。它现在为每一行输入调用我的命令一个新的时间,导致命令为每一行重做所有设置。

我可以更改调用管道的方式吗?或者我如何编写我的 cmdlet 以防止这种情况发生?还是我卡住了,因为这就是 Where-Object 的工作方式?

最佳答案

它按设计工作。当您调用命令时,您正在脚本 block 内启动一个新的(嵌套的)管道。

如果您的函数在其 Begin block 中执行昂贵的代码,那么您需要直接将第一个脚本通过管道传输到您的函数中以获得该优势。

.\Find-CalRatioSamples.ps1 data16 | 
Test-GRIDDataset -JobName DiVertAnalysis -JobVersion 13 -Exists -Location UWTeV-linux |
Where-Object { $_ }

但似乎您没有返回您想要的对象(原始对象)。

您可能能够更改 Test-GRIDDataset 的一种方法是实现 -PassThru 开关,尽管您实际上并未接受原始脚本中的完整对象,所以我无法判断这是否可行;但是您编写的代码似乎正在根据名称从某处检索...东西(?)。也许这就足够了?当指定 -PassThru 时,如果对象存在则通过管道发送对象(而不仅仅是它们是否存在的 bool 值)。

那么你的代码应该是这样的:

.\Find-CalRatioSamples.ps1 data16 | 
Test-GRIDDataset -JobName DiVertAnalysis -JobVersion 13 -Exists -Location UWTeV-linux -PassThru

关于powershell - 管道语义不会传播到 Where-Object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41744958/

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