使用 invoke-command 时如何将 xml 元素传递给 scriptBlock

Nat*_*lls 5 xml powershell invoke-command

使用 PowerShell 3.0,我使用 Invoke-Command cmdlet 将 xmlElement 传递给脚本块。问题是我认为 scriptBlock 将参数作为 arrayList 而不是作为 xmlElement 接收(实际上,我知道收到的参数是ArrayList我注销时的$service.GetType())。

这是我的 XMLElement:

<Service>
    <ServiceName>Spooler</ServiceName>
    <Startup>Disabled</Startup>
</Service>
Run Code Online (Sandbox Code Playgroud)

这是我的脚本块:

$scptModifyService = {
    param (
        $service
    );
    Set-Service -Name $service.ServiceName -StartupType $service.Startup;
}
Run Code Online (Sandbox Code Playgroud)

这是我调用 scriptBlock 的代码:

## Modify remote Services:
foreach($service in $XML.QCSettings.Services.Service) {
    Invoke-Command -ScriptBlock $scptModifyService -ComputerName $ComputerName -ArgumentList $service;
}
Run Code Online (Sandbox Code Playgroud)

根据我对 Invoke-Command cmdlet (get-help invoke-command) 的理解,ArgumentList 可以将一个对象作为输入,所以我认为这不是我如何在“foreach”中调用脚本块的问题'循环上面。希望这是有道理的。

有没有人知道如何将我的脚本块中的参数作为 xmlElement 而不是作为ArrayList.

我已经尝试了几件事(在我的脚本块中):

param( $service = [xml]Get-Content args[0] );
Run Code Online (Sandbox Code Playgroud)

以及该代码的其他变体。

Kei*_*ill 1

从你所展示的内容来看,我没有看到脚本块如何获取 ArrayList,但你仍然可以完成这项工作。ArrayList 是否包含正确的 XmlElement?如果是这样,您可以通过仅处理一个或多个服务条目来使您的函数更加健壮,如下所示:

$scptModifyService = {
    param (
        [Xml.XmlElement[]]$service
    );

    foreach ($s in $service) {
        Set-Service -Name $s.ServiceName -StartupType $s.Startup;
    }
}
Run Code Online (Sandbox Code Playgroud)

那么你应该可以像这样调用它:

Invoke-Command -ScriptBlock $scptModifyService -ComputerName $ComputerName -ArgumentList $XML.QCSettings.Services.Service
Run Code Online (Sandbox Code Playgroud)