2016-07-13 18 views
0

Ich möchte "High Performance" -Powerplan auf mehreren Server-Rechnern einstellen. Ich habe das folgende Skript, das läuft gut, wenn ich dies auf den Servern nacheinander ausführen.Einstellen des Energiesparplans auf mehreren Servern mit Powershell

Set-Powerplan "High Performance"

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 
} 

Wie eine Liste der Server zu diesem Skript übergibt, so dass der Energieplan rekursiv auf allen Servern festgelegt ist? Bitte helfen Sie mir.

Antwort

1

Fügen Sie einfach den Computername Parameter zu Ihrer Funktion und Get-WmiObject darin. Ich habe auch this solution verwendet, um den Prozess remote zu starten.

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 
} 
0

Sie müssen Änderungen am Skript machen, wie unten vorgeschlagen:

[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 

Und diesen Befehl verwenden, um mehrere Server Ziel:

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

Wo Computers.txt wird Servernamen getrennt haben durch neuer Zeilencharakter