使用Powershell在远程服务器上分发脚本级别作业

时间:2016-04-07 16:25:49

标签: powershell

更多的理论问题......

我有一个PowerShell脚本,存在于三台服务器上。在此示例中,三个服务器是:

  1. server1
  2. 服务器2
  3. 服务器3
  4. 我正在使用另一台计算机 server4 ,在指定远程时使用 Invoke-Command 远程调用脚本 C:\ ExampleScript.ps1 机器通过 ComputerName 参数。该脚本的最终目标是检测PowerShell是否正在运行,如果不是,那么计算机就是“不忙”#34;并且可以打开远程调用的脚本。如果计算机处于忙碌状态,请移至下一台服务器并继续通过三台计算机,直到所有参数值都已耗尽。如果所有机器都很忙,那么如果有办法定期检查流程并查看它们是否仍处于打开状态,那将是理想的选择。以这种方式,脚本的执行可以在各种机器上以尽管原始的方式平衡。

    请考虑以下代码:

    $servers = "server1","server2","server3"
    $data = "param1", "param2", "param3", "param4", "param5", "param6"
    
    #somehow loop through the different servers/data using the above arrays
    $job = Invoke-Command $servers[0] {
    $ProcessActive = Get-Process powershell -ErrorAction SilentlyContinue
    if($ProcessActive -eq $null)
    {
        "Running"
        Invoke-Command -ComputerName $env:computername -FilePath C:\ExampleScript.ps1 -ArgumentList $data[0]
    }
    else
    {
         "Busy go to next machine"
    }
     } -AsJob 
    Wait-Job $job 
    $r = Receive-Job $job 
    $r 
    

    试图实现的预期结果是尝试根据是否存在活动的PowerShell进程来跨机器对脚本进行负载平衡,如果没有移动到下一台机器上并执行相同的测试和随后的可能执行。该脚本应该遍历$ data数组(或其他)中指定的所有值。

1 个答案:

答案 0 :(得分:5)

我发现这个问题很有趣,所以我想尝试一下。

SelectToken()

基本上我创建了一个数组,并为每个服务器不断填充一个作业。

新作业启动时会从列表中删除数据,如果作业失败,则会将其添加回来。这是为了避免服务器使用相同的数据/参数运行脚本。

我目前缺乏适当的环境来测试这个问题,但明天会在工作中发挥作用,如果需要,可以根据任何更改更新我的答案。