我可以通过管道传递一个脚本块吗?例如,而不是
Invoke-Command -ScriptBlock {Get-Job}
我可以(概念上)做以下事情吗?
{Get-Job} | Invoke-Command -ScriptBlock $_
答案 0 :(得分:2)
当然,你可以。 $_
(又名$PSItem
)在ForEach-Object
或Where-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; };
注意上面的代码:
-Process
上的ForEach-Object
参数是“第一个”参数,因此通常您不必指定参数的名称。为了清楚起见,我确实指定了完整的ForEach-Object
cmdlet名称,并在第二个示例中添加了-Process
参数名称。
以下是我们声明Array
个ScriptBlock
个对象的示例。然后,我们将包含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; };