我使用以下命令来运行管道.
.\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的工作方式?
它按设计工作.当您调用命令时,您将在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