通过管道传递scriptblock

时间:2013-12-31 02:09:02

标签: powershell

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

Invoke-Command -ScriptBlock {Get-Job}

我可以(概念上)做以下事情吗?

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

1 个答案:

答案 0 :(得分:2)

当然,你可以。 $_(又名$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. 获取当前路径下的子项列表
  4. -Process上的ForEach-Object参数是“第一个”参数,因此通常您不必指定参数的名称。为了清楚起见,我确实指定了完整的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; };