当前位置:  开发笔记 > 运维 > 正文

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

如何解决《管道语义不会传播到Where-Object》经验,为你挑选了1个好方法。

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

.\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的工作方式?



1> briantist..:

它按设计工作.当您调用命令时,您将在scriptblock中启动一个新的(嵌套的)管道.

如果你的函数在其Begin块中执行昂贵的代码,那么你需要直接将第一个脚本传递到你的函数中以获得这个优势.

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

但是,似乎你没有返回你想要的对象(原始对象).

你可以改变的一种方法Test-GRIDDataset是实现一个-PassThru开关,虽然你实际上并没有接受原始脚本中的完整对象,所以我无法判断这是否可行; 但是你写的代码似乎是从某个地方根据名称检索......东西(?).也许这就足够了?当-PassThru指定,通过管道是否存在(而不仅仅是他们是否这样做布尔)发送的对象.

然后你的代码看起来像这样:

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

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有