列出物理驱动器空间

时间:2016-01-06 12:54:33

标签: powershell export-to-csv

我有大约200台服务器,我需要获得磁盘空间和逻辑驱动器空间详细信息(可用空间,已用空间和总空间)。

这是我的PowerShell查询。

$infoObjects = New-Object PSObject
foreach ($machine in $servers) {
  $counts = Get-WmiObject -Query "SELECT * FROM Win32_DiskDrive" -ComputerName $machine
  $total_disk =  @($counts).Count
  $i = 0
  $total_disk = $total_disk -1

  for (; $i -le $total_disk; $i++) {
    $a = $i
    $a  = Get-WmiObject -Query "SELECT * FROM Win32_DiskDrive WHERE DeviceID='\\\\.\\PHYSICALDRIVE$i'" -ComputerName $machine

    $b = $i
    $b = [math]::round($a.size /1GB)

    Add-Member -InputObject $infoObject -MemberType NoteProperty -Name "Physical_Disk $i" -Value $b
  }
  $infoObject | Export-Csv -Path Inventory.csv -Append -Force -NoTypeInformation 
}

它给了我想要的输出但是如果某些服务器有多个磁盘或者逻辑驱动器多于输出卡住了第一个服务器的那个驱动器数量。它没有给我输出其他服务器的其余驱动器的CSV文件。

以下是我所说的例子。

ServerName Physical_Disk 0 Physical_Disk 1 Physical_Disk 2 Physical_Disk 3
Server1 100 20  40
Server2 85
Server3 60  450 200 420
Server4 60
Server5 60                  
Server10    55  20  40

如果我似乎无法解释问题。让我再试一次。

  • 第一台服务器有2个物理驱动器进入我的输出文件(CSV)。
  • 第二台服务器还有2个也是CSV文件的物理驱动器。
  • 但是第三台服务器有两个以上的驱动器,输出中只显示了两个驱动器。

3 个答案:

答案 0 :(得分:2)

UPDATE USERS_1 as UL INNER JOIN USERS_2 as US ON US.id = 4 SET UL.claimedBy = US.username WHERE UL.username="myUsername" 假设列表中的所有对象都是统一的,即它们都具有相同的属性,只是具有不同的值。它需要第一个元素的属性来确定要导出的内容。要么确保所有对象具有相同的属性,要么使用不同的输出方法,例如将每个主机的所有磁盘信息放入一个数组中,并将其写入输出文件,例如:像这样:

Export-Csv
顺便说一句,你不需要多个WMI查询,因为第一个已经返回所有磁盘,包括它们的大小。

答案 1 :(得分:1)

我想指出有几个地方可能会出现错误。这个答案的目的是解决未知数量的标题。我建议您在尝试集成它之前运行它以查看它试图向您显示的内容。

# Gather all wmi drives query at once
$alldisksInfo = Get-WmiObject –query "SELECT * FROM Win32_DiskDrive" -ComputerName $servers -ErrorAction SilentlyContinue | Group-Object __Server

# Figure out the maximum number of disks
$MaximumDrives = $alldisksInfo | Measure-Object -Property Count -Maximum | Select-Object -ExpandProperty Maximum

# Build the objects, making empty properties for the drives that dont exist for each server where need be. 
$servers | ForEach-Object{
    # Clean the hashtable
    $infoObject = [ordered]@{}

    # Populate Server
    $infoObject.Server = $_    

    # Add other simple properties here
    $infoObject.PhysicalMemory = (Get-WmiObject Win32_PhysicalMemory -ComputerName $infoObject.Server | Measure-Object Capacity -Sum).Sum/1gb

    # Add the disks information from the $diskInfo Array
    $serverDisksWMI = $alldisksInfo | Where-Object{$_.Name -eq $infoObject.Server} | Select-Object -ExpandProperty Group

    for($diskIndex =0; $diskIndex -lt $MaximumDrives;$diskIndex++){
        $infoObject."PhysicalDisk$diskIndex" = [Math]::Round(($serverDisksWMI | Where-Object{($_.DeviceID -replace "^\D*") -eq $diskIndex} | Select -Expand Size)/1GB)
    }

    # Create the custom object now.
    New-Object -TypeName psobject -Property $infoObject
} # | Export-Csv ....

由于这会使用管道,因此您可以在此末尾轻松添加export-CSV

答案 2 :(得分:0)

我有以下脚本:
我正在寻找帮助将输出转换为 Excel 格式

$Pather = Get-Content C:\Servers.txt
foreach($Path in $Pather)
{
  (Get-Acl $Path).access | ft $path,IdentityReference,FileSystemRights,AccessControlType,IsInherited -auto
}