首页 > 解决方案 > 如何在 PowerShell 上为每个循环运行并行

问题描述

我在下面有一个 Powershell 脚本,它在多个远程服务器上运行计划任务:

Workflow Invoke-ParallelWorkflow
{
    $ListFile='server_list.txt'
    $ServerList = (get-content $ListFile) -match '^[^#\r\n].*'

    ForEach ($Server in $ServerList)
    {
        InlineScript{ Invoke-Command -ComputerName $Server -ScriptBlock { schtasks /run  /tn MM\fileOSclean }}
    }
}

Invoke-ParallelWorkflow

pause

问题是它没有读取 $Server 变量的值

Invoke-Command : Cannot validate argument on parameter 'ComputerName'. The argument is null or empty. Provide an
argument that is not null or empty, and then try the command again.
At Invoke-ParallelWorkflow:15 char:15
+
    + CategoryInfo          : InvalidData: (:) [Invoke-Command], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.InvokeCommandCommand
    + PSComputerName        : [localhost]

如果我删除 ForEach 并对每个服务器名称进行硬编码,该脚本将起作用,如下所示:

Workflow Invoke-ParallelWorkflow
{
    parallel
    {
        InlineScript{ Invoke-Command -ComputerName ServerName1 -ScriptBlock { schtasks /run  /tn myScheduleTask }}
        InlineScript{ Invoke-Command -ComputerName ServerName2 -ScriptBlock { schtasks /run  /tn myScheduleTask }}
        InlineScript{ Invoke-Command -ComputerName ServerName3 -ScriptBlock { schtasks /run  /tn myScheduleTask }}
    }
}

Invoke-ParallelWorkflow

pause

server_list.txt 有一个有效的内容,我可以write-host $Server在 ForEach 命令中运行时输出它

标签: powershell

解决方案


推荐阅读