是否有更好的方法将信息传递到 where-object
中的脚本块中?过滤脚本而不是使用父范围的变量?
背景:
我有一个脚本来查找未 checkin 和/或修改过的源文件与源代码控制,并且有一个参数可以进行更详尽的搜索。我用 where-object
在几个地方,脚本块对象包含在我根据脚本的输入参数自定义的脚本范围变量中。
因此,如果您要求进行彻底搜索,过滤器会将候选文件与所有 TFS 文件进行比较,以查看该文件是否不在源代码管理中,如果您选择不太彻底的搜索,过滤器将仅与已检查的文件进行比较- out files 以查看文件是否已修改但未 check out 。
自定义脚本块是指脚本范围的变量,其中包含对源代码控制进行查询的结果。
所以我的问题是我想摆脱全局(脚本级)变量并将所有必要的信息作为参数传递给脚本块。如果我使用 invoke-command
,我会使用 ArgumentList
参数来执行此操作。 Where-Object
好像没有那个在脚本块中使用父作用域变量引用的一个缺点是我无法更改这些变量,所以我无法进行延迟初始化(或者至少我还没有弄清楚如何做,我不是这方面的专家) Powershell 的范围规则。)
最佳答案
只是为了扩展基思提到的内容,你可以这样做:
ps> $x=2
ps> 1..5 | where (& {param($v); { $_ -eq $v }.getnewclosure() } $x )
2
我尝试关闭隐含
$args
保存参数声明但 $args
似乎免于捕获。它更有可能被捕获但只是被踩踏。$x
可以很容易地替换为另一个函数调用,如 (get-x)
.本质上,我正在调用一个 scriptblock,它返回一个关闭外部 scriptblocks 参数的 scriptblock。本质上与 Keiths 的实现相同,只是更简洁 [和迟钝]。Lambdas 取胜。
我只希望有一种更简洁的方式来获得闭包语义。也就是说,我很高兴该方法被采用而不是不被采用。
-Oisin
关于powershell - 如何在 Powershell 中使用带有 Where-Object 的参数化脚本 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4960625/