2

コンピューター上のすべてのHDDを反復処理し、それらのドライブとアレイ内の物理ドライブへのマッピングに関する情報を返す機能があります。

この関数でカスタムオブジェクトの情報を返したいのですが。

関数は次のとおりです。

##--------------------------------------------------------------------------
##  FUNCTION.......:  Get-HDDInfo
##  PURPOSE........:  
##  REQUIREMENTS...:  
##  NOTES..........:  
##--------------------------------------------------------------------------
Function Get-HDDInfo {
    [CmdletBinding()]
        Param([Parameter(Mandatory = $True,
            ValueFromPipeLine = $True,
            Position = 0)]
            [String[]]$ComputerName
        )#END: Param
    $W32_DD = @(gwmi Win32_DiskDrive -ComputerName $ComputerName)
    $Array = @()

    $W32_DD | foreach { 
        $query = "ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" `
        + $_.DeviceID + "'} WHERE ResultClass=Win32_DiskPartition" 
        $Array += $_.Name
        $Array += $_.Model
        <#
        $obj = New-Object PSObject
        $obj.PSObject.typenames.insert(0,'JoeIT.Custom.SystemInfo')
        $obj | Add-Member -MemberType NoteProperty -Name `
            "PDCaption" -Value $_.Name
        $obj | Add-Member -MemberType NoteProperty -Name `
            "PDModel" -Value $_.Model
        $Array += $obj
        #>
        Get-WmiObject -Query $query | foreach { 

            $Array += $_.Name
            $Array += $_.Description 
            $Array += $_.PrimaryPartition

            #$obj = New-Object PSObject
            <#
            $obj.PSObject.typenames.insert(0,'JoeIT.Custom.SystemInfo')
            $obj | Add-Member -MemberType NoteProperty -Name `
                        "DPName" -Value $_.Name
            $obj | Add-Member -MemberType NoteProperty -Name `
                        "DPDescription" -Value $_.Description
            $obj | Add-Member -MemberType NoteProperty -Name `
                        "DPPrimary" -Value $_.PrimaryPartition
            #>
            $query2 = "ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" `
            + $_.DeviceID + "'} WHERE ResultClass=Win32_LogicalDisk" 

            Get-WmiObject -Query $query2 | ForEach {
            $Array+= $_.Name
            $Used = [math]::round($_.Size/1024/1024/1024,0)
            $Free = [math]::round($_.FreeSpace/1024/1024/1024,0)
            $Array += [String]$Used +"GB"
            $Array += [String]$Free +"GB"
            #Return $Array;
            #$Array = $Null
            }

            <#
            $Array += $obj
            $obj = $Null
            #>
        }#END: Get-WmiObject -Query
    }#END: $W32_DD | foreach
    ##----------------------------------------------------------------------
    ##  Store results in custom Object
    ##----------------------------------------------------------------------
    Return $Array
}#END: Function Get-HDDInfo

コメントアウトされているのは、情報をカスタムオブジェクトに取り込もうとした私の試みによるものです。少し燃え尽きているかもしれませんが、これを正しく機能させることができないようです。ご覧のとおり、コメントアウトされたコードは名前付きプロパティを上書きしようとします-私がそれを書いたときにそれを知っていましたが、何らかの理由でそれがとにかく機能することを期待していました;)

休みなくして3週間働くべきではないかもしれませんが、私の脳はこの問題を解決させてくれません。

私が望んでいるのは、次のようなことができるようにすることです。

$test = (get-hddinfo $SVR01)
$test.PhysicalDrive1
$test.Partition1
$test.DriveLetter1
$test.TotalSize1
$test.FreeSpace1

これにより、SVR01という名前のコンピューターにクエリが実行され、最初の物理HDD、そのドライブの最初の論理パーティション、割り当てられたドライブ文字、ディスクの合計サイズ、およびディスクの空き領域が書き出されます。

その後、私は次のようなことをすることができます

$test.PhysicalDrive2
$(same code here for the second physical drive)

私は一体何を間違っているのですか?

4

2 に答える 2

2

これを試して:

[CmdletBinding()]
        Param([Parameter(Mandatory = $True,
            ValueFromPipeLine = $True,
            Position = 0)]
            [String[]]$ComputerName
        )
    $W32_DD = @(gwmi Win32_DiskDrive -ComputerName $ComputerName)

    $a = new-object  System.Object
    $sc3 = 1
    $sc2 = 1
    $sc1 = 1
    $W32_DD | foreach { 
        $query = "ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" `
        + $_.DeviceID + "'} WHERE ResultClass=Win32_DiskPartition" 

        $a | Add-Member -type NoteProperty -name DiskDriveName$sc1 -value $_.Name
        $a | Add-Member -type NoteProperty -name DiskDriveModel$sc1 -value $_.Model       

        Get-WmiObject -Query $query | foreach { 

            $a | Add-Member -type NoteProperty -name PartitionName$sc2 -value $_.Name
            $a | Add-Member -type NoteProperty -name PartitionDescription$sc2 -value $_.Description
            $a | Add-Member -type NoteProperty -name PrimaryPartition$sc2 -value $_.PrimaryPartition

            $query2 = "ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" `
            + $_.DeviceID + "'} WHERE ResultClass=Win32_LogicalDisk" 


            Get-WmiObject -Query $query2 | ForEach {

            $a | Add-Member -type NoteProperty -name LogicalDiskName$sc3 -value $_.Name           

            $Used = [math]::round($_.Size/1024/1024/1024,0)
            $Free = [math]::round($_.FreeSpace/1024/1024/1024,0)

            $a | Add-Member -type NoteProperty -name UsedSpace$sc3 -value $([String]$Used +"GB")
            $a | Add-Member -type NoteProperty -name FreeSpace$sc3 -value $([String]$Free +"GB")

            $sc3++
            }
           $sc2++
          }       
       $sc1++
    }

    Return $a
于 2012-06-27T05:41:15.990 に答える
1

ここに方法があります、それはあなたが望むものではありませんが、それはあなたにそれをする方法を与えます:

##-------------------------------------------------------------------------- 
##  FUNCTION.......:  Get-HDDInfo 
##  PURPOSE........:   
##  REQUIREMENTS...:   
##  NOTES..........:   
##-------------------------------------------------------------------------- 
Function Get-HDDInfo
{ 
  [CmdletBinding()] 
  Param([Parameter(Mandatory = $True, ValueFromPipeLine = $True, Position = 0)] 
        [String[]]$ComputerName)#END: Param 



  $W32_DD = @(gwmi Win32_DiskDrive -ComputerName $ComputerName) 
  $ArrayofPD = @() 

  foreach ($dd in $W32_DD)
  {  
    $query = "ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" + $dd.DeviceID + "'} WHERE ResultClass=Win32_DiskPartition"  

    # create a new physical disc object
    $PDobj = New-Object PSObject 
    $PDobj | Add-Member -MemberType NoteProperty -Name "PDCaption" -Value $dd.Name 
    $PDobj | Add-Member -MemberType NoteProperty -Name "PDModel" -Value $dd.Model 

    $ArrayofLD = @()
    $diskParts = Get-WmiObject -Query $query
    foreach ($diskPart in $diskParts)
    {  
      # create a new logical disc object
      $LDobj = New-Object PSObject 
      $LDobj | Add-Member -MemberType NoteProperty -Name "DPName" -Value $diskPart.Name 
      $LDobj | Add-Member -MemberType NoteProperty -Name "DPDescription" -Value $diskPart.Description 
      $LDobj | Add-Member -MemberType NoteProperty -Name "DPPrimary" -Value $diskPart.PrimaryPartition 

      $query2 = "ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" + $diskPart.DeviceID + "'} WHERE ResultClass=Win32_LogicalDisk"  

      $LogicalDisk = Get-WmiObject -Query $query2
      if ($LogicalDisk -ne $null)
      {
        $LDobj | Add-Member -MemberType NoteProperty -Name "LGName" -Value $LogicalDisk.Name
        $Used = [math]::round($LogicalDisk.Size/1024/1024/1024,0) 
        $Free = [math]::round($LogicalDisk.FreeSpace/1024/1024/1024,0) 
        $LDobj | Add-Member -MemberType NoteProperty -Name "UsedSpace" -Value $([String]$Used +"GB")
        $LDobj | Add-Member -MemberType NoteProperty -Name "FreeSpace" -Value $([String]$Free +"GB")
      } 
      $ArrayofLD += $LDobj
    }
    $PDobj | Add-Member -MemberType NoteProperty -Name "LogicalDisks" -Value $ArrayofLD 

    $ArrayofPD += $PDobj
  }

  ##---------------------------------------------------------------------- 
  ##  Store results in custom Object 
  ##---------------------------------------------------------------------- 
  Return $ArrayofPD 
}#END: Function Get-HDDInfo 

Clear-Host
$a = Get-HDDInfo localhost
$a

それが与える関数を私のためにドットソースします:

PS C:\Users\JPB\Documents> $a = Get-HDDInfo localhost
PS C:\Users\JPB\Documents> $a

PDCaption                                     PDModel                                       LogicalDisks                                 
---------                                     -------                                       ------------                                 
\\.\PHYSICALDRIVE0                            ST9500420AS                                   {@{DPName=Disque n° 0, partition n° 0; DPD...
\\.\PHYSICALDRIVE1                            ST932042 3AS USB Device                       {@{DPName=Disque n° 1, partition n° 0; DPD...

と :

PS C:\Users\JPB\Documents> $a[0].LogicalDisks

DPName                                        DPDescription                                                                     DPPrimary
------                                        -------------                                                                     ---------
Disque n° 0, partition n° 0                   Système de fichiers installable                                                        True
Disque n° 0, partition n° 1                   Système de fichiers installable                                                        True
于 2012-06-27T05:09:57.847 に答える