使用Powershell在多个服务器上设置电源计划

时间:2016-07-13 10:12:34

标签: powershell powershell-remoting

我想在多台服务器上设置“高性能”powerplan。我在服务器上逐一执行此操作时运行正常的以下脚本。

  

Set-PowerPlan“高性能”

function Set-PowerPlan {

[CmdletBinding(SupportsShouldProcess = $True)]

param (

    [ValidateSet("High performance", "Balanced", "Power saver")]

    [ValidateNotNullOrEmpty()]

    [string] $PreferredPlan = "High Performance"
      )

Write-Host "Setting power plan to `"$PreferredPlan`""

$guid = (Get-WmiObject -Class Win32_PowerPlan -Namespace root\cimv2\power -Filter "ElementName='$PreferredPlan'").InstanceID.ToString()

$regex = [regex]"{(.*?)}$"

$plan = $regex.Match($guid).groups[1].value

powercfg -S $plan

$Output = "Power plan set to "

$Output += "`"" + ((Get-WmiObject -Class Win32_PowerPlan -Namespace root\cimv2\power -Filter "IsActive='$True'").ElementName) + "`""

 Write-Host $Output
}

如何将服务器列表传递给此脚本,以便递归地在所有服务器上设置电源计划?

2 个答案:

答案 0 :(得分:1)

只需将computername参数添加到您的函数中,并在其中添加Get-WmiObject。我还使用this solution远程启动进程。

function Set-PowerPlan {

    [CmdletBinding(SupportsShouldProcess = $True)]
    param (

        [ValidateSet("High performance", "Balanced", "Power saver")]
        [ValidateNotNullOrEmpty()]
        [string]$PreferredPlan = "High Performance",
        [string]$ComputerName = $env:COMPUTERNAME
    )

    Write-Host "Setting power plan to `"$PreferredPlan`""

    $guid = (Get-WmiObject -Class Win32_PowerPlan -Namespace root\cimv2\power -Filter "ElementName='$PreferredPlan'" -ComputerName $ComputerName).InstanceID.ToString()

    $regex = [regex]"{(.*?)}$"

    $plan = $regex.Match($guid).groups[1].value

    #powercfg -S $plan
    $process = Get-WmiObject -Query "SELECT * FROM Meta_Class WHERE __Class = 'Win32_Process'" -Namespace "root\cimv2" -ComputerName $ComputerName
    $results = $process.Create("powercfg -S $plan")

    $Output = "Power plan set to "
    $Output += "`"" + ((Get-WmiObject -Class Win32_PowerPlan -Namespace root\cimv2\power -Filter "IsActive='$True'" -ComputerName $ComputerName).ElementName) + "`""

    Write-Host $Output
}

$ServerList = @(
    'CompName1',
    'Compname2'
)

foreach ($server in $ServerList ) {
    Set-PowerPlan -PreferredPlan 'High performance' -ComputerName $comp
}

答案 1 :(得分:0)

您必须按照以下建议更改脚本:

[CmdletBinding(SupportsShouldProcess = $True)]
param (

    [ValidateSet("High performance", "Balanced", "Power saver")]

    [ValidateNotNullOrEmpty()]

    [string] $PreferredPlan = "High Performance"
      )

Write-Host "Setting power plan to `"$PreferredPlan`""

$guid = (Get-WmiObject -Class Win32_PowerPlan -Namespace root\cimv2\power -Filter "ElementName='$PreferredPlan'").InstanceID.ToString()

$regex = [regex]"{(.*?)}$"

$plan = $regex.Match($guid).groups[1].value

powercfg -S $plan

$Output = "Power plan set to "

$Output += "`"" + ((Get-WmiObject -Class Win32_PowerPlan -Namespace root\cimv2\power -Filter "IsActive='$True'").ElementName) + "`""

 Write-Host $Output

并使用此命令定位多个服务器:

Invoke-Command -FilePath .\Set-PowerPlan.ps1 -ComputerName (Get-Content -Path C:\temp\computers.txt)

其中Computers.txt的服务器名称由换行符分隔。