首页 > 解决方案 > PowerShell 驱动器大小

问题描述

我发现了如何获取驱动器大小的想法

我在将它合并到我的脚本时遇到问题,因为我不知道在哪里插入代码。此外,即使存在多硬盘驱动器系统,每台计算机也只能输出一条线。

这是我正在使用的代码,包括“获取驱动器数据”代码

# Output file location to be changed as needed
$file="C:\scripts\reports\InentoryTest_$((Get-Date).ToString('MM-dd-yyyy')).csv"
$txt="c:\scripts\reports\InentoryTest-error_$((Get-Date).ToString('MM-dd-yyyy')).txt"

# Getting computers from Active Directory
$Computers = Get-ADComputer -Filter {Name -like 'M416*'} | select -expand name

  Foreach($Computer in $Computers){

if(!(Test-Connection -ComputerName $Computer -BufferSize 16 -Count 1 -ea 0 -quiet))
 {
 write-host "Cannot reach $Computer is offline" -ForegroundColor red
 }
 else
 {

$Output = @()

    Try
    {
       # Get Drive Data 
       $disk   = Get-WmiObject -ComputerName $Computer Win32_LogicalDisk | Where-Object { ( $_.DriveType ) -eq 3 -and ( ( $_.freespace / $_.size ) -lt .1  ) } | ForEach-Object -Process {
                   [pscustomobject] @{
        Drive        = $_.DeviceID
        Size         = '{0:N1}' -f ( $_.Size / 1GB )
        Free         = '{0:N1}' -f ( $_.freespace / 1GB )
        PercentFree  = '{0:N1}' -f ( $_.freespace / $_.size * 100 )
                        }
                    } 
        $domain = Get-WmiObject Win32_ComputerSystem -ComputerName $Computer -ErrorAction Stop
        $os   = Get-WmiObject Win32_OperatingSystem -ComputerName $Computer -ErrorAction Stop
        $mac  = Get-WmiObject -class Win32_NetworkAdapterConfiguration -Filter "IPEnabled='True'" -ComputerName $Computer -ErrorAction Stop
        $bios = Get-WmiObject win32_bios -ComputerName $Computer -ErrorAction Stop
        $cpu  = Get-WmiObject –class Win32_processor -ComputerName $Computer -ErrorAction Stop
        $AD   = Get-ADComputer $Computer -properties Name,Lastlogondate,ipv4Address,enabled,description,DistinguishedName -ErrorAction Stop
        $ram  = "{0} GB" -f ((Get-WmiObject Win32_PhysicalMemory -ComputerName $Computer -ErrorAction Stop | Measure-Object Capacity  -Sum).Sum / 1GB)
        $pc   = Get-WmiObject win32_computersystem -ComputerName $Computer -ErrorAction Stop | select @{Name = "Type";Expression = {if (($_.pcsystemtype -eq '2')  )
                {'Laptop'} Else {'Desktop Or Other'}}
        },Manufacturer,@{Name = "Model";Expression = {if (($_.model -eq "$null")  ) {'Virtual'} Else {$_.model}}},username

        # Create Output
        $data = New-Object PSObject -Property @{
            SerialNumber              = $bios.serialnumber -replace "-.*"
            Computername              = $AD.name
            IPaddress                 = $AD.ipv4Address
            MACaddress                = $mac.MACAddress
            Enabled                   = $AD.Enabled
            Description               = $AD.description
            OU                        = $AD.DistinguishedName.split(',')[1].split('=')[1] 
            DC                        = $domain.domain
            Type                      = $pc.type
            Manufacturer              = $pc.Manufacturer
            Model                     = $pc.Model
            RAM                       = $ram
            Disk                      = $disk #Get Drive Data
            ProcessorName             = ($cpu.name | Out-String).Trim()
            NumberOfCores             = ($cpu.NumberOfCores | Out-String).Trim()
            NumberOfLogicalProcessors = ($cpu.NumberOfLogicalProcessors | Out-String).Trim()
            Addresswidth              = ($cpu.Addresswidth | Out-String).Trim()
            OperatingSystem           = $os.caption
            InstallDate               = ([WMI] '').ConvertToDateTime($os.installDate)
            LastLogonDate             = $ld.lastlogondate
            LoggedinUser              = $pc.username
        }

        # Only do this kind of update if it hasn't failed yet
        $Output += $data
        $desc="$($mac.MACAddress) ( $($bios.serialnumber -replace "-.*") ) $($pc.Model) | $((Get-Date).ToString('MM-dd-yyyy'))"
        #Set-ADComputer $Computer -Description $desc -verbose
        $Output | select Computername,Enabled,Description,IPaddress,MACaddress,OU,DC,Type,SerialNumber,Manufacturer,Model,RAM,Disk,ProcessorName,NumberOfCores,NumberOfLogicalProcessors,Addresswidth,OperatingSystem,InstallDate,LoggedinUser,LastLogonDate | export-csv -Append $file -NoTypeInformation 

    }
    Catch [Exception]
    {
    # Only do this kind of update if create output has failed
        $ErrorMessage = $_.Exception.Message
        Add-Content -value "$Computer, $ErrorMessage, skipping to next" $txt
        #Set-ADComputer $Computer -Description $ErrorMessage
            continue
      }
     }
    }

标签: powershelldisk

解决方案


您正在构建一个复杂的分层对象,因此最好收集所有对象,然后将结果转储为 JSON 或 XML 文件。但是,如果您确实想要一个平面字符串,那么您必须在将磁盘数据添加到要转储到 CSV 的对象之前将其显式格式化为字符串。就像是:

$diskData = $disk | foreach {
  "[Drive: $($_.DeviceID), Size: $([int]($_.Size/1GB)), FreeSpace: $([int]($_.freespace/1GB)), PercentFree: $([int]($_.freespace/$_.size *100))]"
}
$diskdata = $diskdata -join " "

推荐阅读