Sunil Kumar
Sunil Kumar

Reputation: 23

PowerShell Script Not Working as Expected (foreach loop)

I'm using below PowerShell script to set server power plan to High Performance mode. The issue is, it's making changes only to the server where the I'm executing the script even after passing server names through a text file (Servers.txt). I've used foreach loop to iterate through the server list, but still no luck. Not sure where I'm missing the logic, can someone help with this. Thanks in advance.

$file = get-content J:\PowerShell\PowerPlan\Servers.txt
foreach ( $args in $file)
{
    write-host "`r`n`r`n`r`nSERVER: " $args
    Try
    {
        gwmi -NS root\cimv2\power -Class win32_PowerPlan -CN $args | select ElementName, IsActive | ft -a
        #Set power plan to High Performance
        write-host "`r`n<<<<<Changin the power plan to High Performance mode>>>>>"
        $HighPerf = powercfg -l | %{if($_.contains("High performance")) {$_.split()[3]}}
        $CurrPlan = $(powercfg -getactivescheme).split()[3]
        if ($CurrPlan -ne $HighPerf) {powercfg -setactive $HighPerf}
        #Validate the change
        gwmi -NS root\cimv2\power -Class win32_PowerPlan -CN $args | select ElementName, IsActive | ft -a
    }
    Catch
    {
            Write-Warning -Message "Can't set power plan to high performance, have a look!!"
    }
}

Upvotes: 1

Views: 1040

Answers (2)

Chetan Kulkarni
Chetan Kulkarni

Reputation: 404

From the Gist of your Question,I think you may wanna try running the complete Set of commands in Invoke-Command Invoke-Command Documentation and pass the system name in -ComputerName

$file = get-content J:\PowerShell\PowerPlan\Servers.txt
foreach ( $args in $file)
{
invoke-command -computername $args -ScriptBlock {
write-host "`r`n`r`n`r`nSERVER: " $args
    Try
    {
        gwmi -NS root\cimv2\power -Class win32_PowerPlan -CN $args | select ElementName, IsActive | ft -a
        #Set power plan to High Performance
        write-host "`r`n<<<<<Changin the power plan to High Performance mode>>>>>"
        $HighPerf = powercfg -l | %{if($_.contains("High performance")) {$_.split()[3]}}
        $CurrPlan = $(powercfg -getactivescheme).split()[3]
        if ($CurrPlan -ne $HighPerf) {powercfg -setactive $HighPerf}
        #Validate the change
        gwmi -NS root\cimv2\power -Class win32_PowerPlan -CN $args | select ElementName, IsActive | ft -a
    }
    Catch
    {
            Write-Warning -Message "Can't set power plan to high performance, have a look!!"
    }

}

}

Upvotes: 0

vonPryz
vonPryz

Reputation: 24071

The problem is that although a foreach loop is used to iterate all the servers, the names are never used for actual power configuration. That is,

$HighPerf = powercfg -l | %{if($_.contains("High performance")) {$_.split()[3]}}

will always be executed on the local system. Thus, no power plan is changed on remote server.

As a work-around, maybe psexec or Powershell remoting would do, as powercfg doesn't seem to support remote system management.

The MS Scripting Guys have a WMI based solution too, as usual.

Upvotes: 1

Related Questions