web-dev-qa-db-ja.com

PowerShellスクリプトで無効なクラスエラーが発生します

このスクリプトを実行すると、このエラーが発生します

Get-WmiObject:無効なクラス「Msvm_ImageManagementService」

そして

Get-WmiObject:無効なクラス "MSPower_DeviceEnable"

そして

Get-WmiObject:無効なクラス "MSPower_DeviceWakeEnable"

上記のエラーは一部のコンピューターでのみ発生し、他のコンピューターでは発生しません。

$computerlist = Get-Content F:\Code\powershell\network_shutdown\computer-list.csv

foreach ($computer in $computerlist) 
{
    # Main Processing Section
    # Write-Host $computer
    if((Test-Connection -Cn $computer -BufferSize 16 -Count 1 -ea 0 -quiet))
    {
        Write-Host $computer
        Write-Host "Disable `"Allow the computer to turn off this device to save power`""
        Get-WmiObject -computername $computer Win32_NetworkAdapter -filter "AdapterTypeId=0" | % {
            $strNetworkAdapterID=$_.PNPDeviceID.ToUpper()
            Get-WmiObject -class MSPower_DeviceEnable -computername $computer -Namespace $namespace | % {
                if($_.InstanceName.ToUpper().startsWith($strNetworkAdapterID))
                {
                    $_.Enable = $false
                    $_.Put() | Out-Null
                }
            }
        }

        Write-Host "Disable `"Allow this device to wake the computer`""
        Get-WmiObject -computername $computer Win32_NetworkAdapter -filter "AdapterTypeId=0" | % {
            $strNetworkAdapterID=$_.PNPDeviceID.ToUpper()
            Get-WmiObject -class MSPower_DeviceWakeEnable -computername $computer -Namespace $namespace | % {
                if($_.InstanceName.ToUpper().startsWith($strNetworkAdapterID)){
                    $_.Enable = $false
                    $_.Put() | Out-Null
                }
            }
        }

        Write-Host "Disable `"Only allow a magic packet to wake the computer`""
        Get-WmiObject -computername $computer Win32_NetworkAdapter -filter "AdapterTypeId=0" | % {
            $strNetworkAdapterID=$_.PNPDeviceID.ToUpper()
            Get-WmiObject -class MSNdis_DeviceWakeOnMagicPacketOnly -computername $computer -Namespace $namespace | % {
                if($_.InstanceName.ToUpper().startsWith($strNetworkAdapterID)){
                    $_.EnableWakeOnMagicPacketOnly = $false
                    $_.Put() | Out-Null
                }
            }
        }
    } else {
        Write-Host $computer + " OFFLINE"
        $output = new-object psobject
        $output | Add-Member noteproperty ComputerName $computer

        $array += $output
    }

    $array | Export-Csv -Path F:\Code\powershell\network_shutdown\Results.csv
}

すべてのコンピューターをターゲットにできるように名前空間を修正するにはどうすればよいですか?

エラーログも機能していません。 OFFLINE、FAILED、SUCCESSをCSVファイルにするにはどうすればよいですか? (上記のコードでは、オフラインのものだけをキャプチャしていることを認識していますが、それも機能しません)

私は次のようになります

[System.Management.Automation.PSObject]に「op_Addition」という名前のメソッドが含まれていないため、メソッドの呼び出しに失敗しました。

コードはWindows7で実行されています

PowerShellバージョン

Major  Minor  Build  Revision
-----  -----  -----  --------
2      0      -1     -1
3
software is fun

Get-WmiObject:無効なクラス「Msvm_ImageManagementService」

このクラスは、 Hyper-V WMIプロバイダー によって公開されます。ターゲットマシンにHyper-VまたはHyper-V管理ツールがインストールされていない場合、このクラスは存在しません

Get-WmiObject:無効なクラス "MSPower _ *"

MSPowerスーパークラスは公式にはサポートされておらず、派生_ Device *クラスインストールされているネットワークアダプタがWake-on-LANをサポートしていない限り、公開されません

[System.Management.Automation.PSObject]に「op_Addition」という名前のメソッドが含まれていないため、メソッドの呼び出しに失敗しました。

次の行が原因である可能性があります。

$array += $output

$arrayがまだ存在しない場合、PowerShellはそれをPSObjectsの配列にすることを自動的に推測できません-PowerShellは、右側のオブジェクトのタイプを使用しようとします。 「加算演算子」(+)であり、PSObjectはそのような操作をサポートしていないため、正しく失敗します。

スクリプトの先頭に以下を追加します。

$array = @()

空の配列を初期化するには、または明示的なキャストで目的の型を指定するには:

[PSObject[]]$array += $output
3