【问题标题】:Passing a scriptblock through pipeline通过管道传递脚本块
【发布时间】:2013-12-31 02:09:02
【问题描述】:

我可以通过管道传递脚本块吗?例如,而不是

Invoke-Command -ScriptBlock {Get-Job}

我可以(在概念上)执行以下操作吗?

{Get-Job} | Invoke-Command -ScriptBlock $_

【问题讨论】:

  • 顺便问一下,您运行的是什么版本的 PowerShell,以及什么操作系统? $PSItem 之类的某些内容仅在 PowerShell v3.0 及更高版本中可用。
  • 操作系统:Windows 8.1,Posh:v4.0
  • 完美,这就是我在答案中测试的代码。

标签: powershell


【解决方案1】:

当然可以。 $_(又名$PSItem)在ForEach-ObjectWhere-Object 之外无效。所以你必须这样做:

# % is the default alias (short-hand) for ForEach-Object
{ Get-Process } | % { Invoke-Command -ScriptBlock $_; };

您还可以传递$ScriptBlock 对象的数组,如下所示:

{ Get-Process }, { Start-Sleep -Seconds 2 }, { Get-ChildItem } | ForEach-Object -Process { Invoke-Command -ScriptBlock $PSItem; };

注意前面的代码:

  1. 获取进程列表
  2. 睡眠两 (2) 秒
  3. 获取当前路径下的子项列表

ForEach-Object 上的-Process 参数是“第一个”参数,因此通常您不必指定参数的名称。为了清楚起见,我确实指定了完整的 ForEach-Object cmdlet 名称并在第二个示例中添加了 -Process 参数名称。

这是一个示例,我们声明了 ArrayScriptBlock 对象。然后,我们将包含ScriptBlock 对象的数组变量通过管道传输到ForEach-Object。和上面的思路一样,只是单独声明了数组。但请记住,如果您使用的是ForEach-Object,则必须使用-Process 参数,而不是-Begin-End 参数,因为它们只运行一次 每次致电ForEach-Object

$ScriptBlockList = @(
    { Get-Process; };
    { Start-Sleep -Seconds 5; };
    { Start-Job -ScriptBlock { Get-Process; }; };
    );

$ScriptBlockList | ForEach-Object -Process { Invoke-Command -ScriptBlock $PSItem; };

【讨论】:

  • 效果很好。也感谢第二个示例 - 能够传递多个脚本块将非常有用。
  • 酷 - 很高兴听到它帮助了你。干杯
猜你喜欢
  • 2021-09-11
  • 1970-01-01
  • 2019-03-27
  • 2015-06-20
  • 2013-07-30
  • 2013-05-31
  • 2010-10-19
相关资源
最近更新 更多