powershell - 如何在 Powershell 中使用带有 Where-Object 的参数化脚本 block ?

标签 powershell

是否有更好的方法将信息传递到 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/

相关文章:

c# - 使用 PowerShell Split 和正则表达式在正则表达式匹配后返回所有内容

powershell - 如果时间介于 8 :00 AM to 5:30 PM

powershell - 如何在powershell中将字符串转换为十进制?

arrays - Powershell 仅在不存在时添加到数组

powershell - 找不到接受参数的位置参数

c# - 如果 Powershell 构建在 .Net 之上,那么编写脚本而不是 C# 代码的原因是什么?

powershell - 将Powershell对象属性的名称值转换为字符串

email - 在 Powershell 中复制打开的文件

sql - Powershell从txt文件中的查询调用-sqlcmd

windows - 让 AD 用户在 AD 的描述字段中具有特定关键字