Cannont Add-Member как член с именем существует - PullRequest
2 голосов
/ 16 июля 2011

Может кто-нибудь помочь мне с получением информации о диске? У меня есть 3 диска, но я не могу получить их информацию, используя 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
    }
}

}

Ответы [ 2 ]

2 голосов
/ 17 июля 2011

Вы все еще можете установить свойство Name, если добавите параметр -Force.Вы также должны добавить параметр -PassThru для отправки объекта обратно в конвейер:

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

ОБНОВЛЕНИЕ:

По моему мнению, вы можете упростить функцию (без вызовов add-member):

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 
}
1 голос
/ 16 июля 2011

Поскольку существует несколько дисков, необходимо создать свойство диска в виде массива, а затем добавить каждый диск в массив.Кроме того, не забудьте вывести $obj в конце $computername foreach.

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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...