2011-07-16 4 views
1

ディスク情報の取得に誰かが助けてくれますか?私は3枚のディスクを持っていますが、メンバーを追加して情報を得ることができません。名前を持つメンバーとしてCannont Add-Memberが存在する

私はエラーを取得する:

"Add-Member : Cannot add a member with the name "Disks" because a member with that name already exists. If you want to overwrite the member anyway, use the Force parameter to overwrite it." 

は、これは私のコードです:

function Get-Inven { 

param([string[]]$computername) 

#Import-Module ActiveDirectory 

foreach ($computer in $computername) { 
    $disks = Get-WmiObject -Class Win32_LogicalDisk -ComputerName $computer -Filter 'DriveType=3' 
    $os = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $computer 
    #$comp = Get-ADComputer -Filter { cn=$computer } 

    $info = @{ 
     'ComputerName'=$computer; 
     'OSVersion'=$os.caption; 
     'DnsHostName'=$comp.dnshostname 
    } 

    $obj = New-Object -TypeName PSObject -Property $info 

    foreach ($disk in $disks) { 
     $info = @{ 
      'DriveLetter'=$disk.deviceID; 
      'FreeSpace'=($disk.freespace/1MB -as [int]) 
     } 
     $diskobj = New-Object -TypeName PSObject -Property $Info 
     $obj | Add-Member -MemberType NoteProperty -Name Disks -Value $diskobj 
    } 
} 

} 

答えて

1

-Forceパラメータを追加した場合でも、Nameプロパティを設定できます。あなたはまた戻ってパイプラインにオブジェクトを発するように-PassThruスイッチパラメータを追加する必要があります

$obj | Add-Member -MemberType NoteProperty -Name Disks -Value $diskobj -Force -PassThru 

UPDATE:

私の意見では、機能(無アドオンメンバーの呼び出し)を簡素化することができます

foreach ($computer in $computername) { 
    $disks = Get-WmiObject -Class Win32_LogicalDisk -ComputerName $computer -Filter 'DriveType=3' 
    $os = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $computer 
    #$comp = Get-ADComputer -Filter { cn=$computer } 

    $info = @{ 
     ComputerName=$computer 
     OSVersion=$os.caption 
     DnsHostName=$comp.dnshostname 
     FreeSpaceMB= ($disks | foreach { "{0},{1:N0}" -f $_.Caption,($_.freespace/1MB) }) -join ';' 
    } 

    New-Object -TypeName PSObject -Property $info 
} 
+0

'-Force'パラメータは、Disksプロパティの値を上書きします。また、' -PassThru'パラメータが毎回オブジェクトを発行しても、 'Add-Member'は引き続き同じオブジェクトを参照しています。複数のドライブを持つコンピュータでこれを実行すると、単一のドライブに対して同じ情報を持つ複数のオブジェクトが取得されます。ドライブC:、D:およびE:を持つ私のマシンでは、ドライブE:の情報を持つ3つのオブジェクトがそれぞれ得られます。 – Rynant

+0

私はあなたがエラーを持っているので、私はあなたがNameプロパティをオーバーライドすることができることを示したいと思ったので、-Forceについてコメントしていました。とにかく、コード上に2cを追加してスレッドを更新しました。 –

+0

ありがとう@シェイレヴィ、あなたは最高です! :) – PowerShell

1

複数のディスクがあるので、あなたがして、各ディスクを追加し、配列としてディスクプロパティを作成する必要があります配列。また、foreachの$computernameの最後に$objを出力することを忘れないでください。

function Get-Inven { 

param([string[]]$computername) 
$computername = 'localhost' 
foreach ($computer in $computername) { 
    $disks = Get-WmiObject -Class Win32_LogicalDisk -ComputerName $computer -Filter 'DriveType=3' 
    $os = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $computer 
    #$comp = Get-ADComputer -Filter { cn=$computer } 

    $info = @{ 
     'ComputerName'=$computer; 
     'OSVersion'=$os.caption; 
     'DnsHostName'=$comp.dnshostname 
    } 

    $obj = New-Object -TypeName PSObject -Property $info 
    $obj | Add-Member -MemberType NoteProperty -Name Disks -Value @() 
    $obj | Add-Member -MemberType ScriptProperty -Name DisksList -Value { 
     ($this.Disks|%{$_.DriveLetter + ',' + $_.FreeSpace}) -join ';' 
    } 
    foreach ($disk in $disks) { 
     $info = @{ 
      'DriveLetter'=$disk.deviceID; 
      'FreeSpace'=($disk.freespace/1MB -as [int]) 
     } 
     $diskobj = New-Object -TypeName PSObject -Property $Info 
     $obj.Disks += $diskobj 
    } 
    $obj 
} 
} 

$result = get-inven localhost 
$result| select "OSVersion","DnsHostName","ComputerName","DisksList"|ConvertTo-Csv 
+0

こんにちは@Rynant、助けてくれてありがとう、私は、私はSystem.Object []タイプとしてディスクを取得するcsvにtis関数の結果を出力&私は彼らが元のあなたが私を助けることができますか? – PowerShell

+0

$ディスクforeach内に 'New-Object'を配置し、ディスクプロパティを配列として作成しないことで、ディスクごとに完全なオブジェクトを作成できます。また、ScriptPropertyメンバを作成して、表示する方法でディスクを表示することもできます。私は例で私の答えを更新します。 – Rynant