0

我编写了一个简单的脚本,它应该从 OU 获取计算机列表,并报告每台可访问计算机上的磁盘大小和可用空间量。

$computers = Get-ADComputer -SearchBase "ou=Test,ou=test,ou=test,dc=test,dc=test,dc=net" -Filter * | select -ExpandProperty Name

$output = Foreach ($item in $computers) {
    Write-host $item    
    $disk = Get-WmiObject Win32_LogicalDisk -Computer $item -Filter "DeviceID='C:'"
    $disk_size = [math]::Round($disk.Size/1GB,2)
    Write-host $disk_size
    $disk_freespace = [math]::Round($disk.Freespace/1GB,2)
    Write-Host $disk_freespace
}

$output | Export-Csv "networkpath\free_space_on_c_drive.csv" -notypeinformation -encoding "unicode"

输出在屏幕上看起来不错,但导出的 CSV 文件为空。我想我可以更改foreach为,ForEach-Object但我认为将每个脚本放在一个衬里上并不是一个好习惯,如果我需要添加更多动作,那会很痛苦。

这是我根据评论更新的代码:

$computers = Get-ADComputer -SearchBase "ou=t,ou=test,ou=Production,ou=test,dc=test,dc=test,dc=net" -Filter * | select -ExpandProperty Name
$output = Foreach ($item in $computers) {
    $disk = Get-WmiObject Win32_LogicalDisk -Computer $item -Filter "DeviceID='C:'"
    $disk_size = [math]::Round($disk.Size/1GB,2)
    $disk_freespace = [math]::Round($disk.Freespace/1GB,2)
    $output = [PSCustomObject]@{
    Name = $item
        Size = $disk_size
        FreeSpace    = $disk_freespace
    }
}

$output | Export-Csv "networkpath\$((Get-Date).ToString("yyyyMMdd_HHmmss"))_free_space_on_c_drive.csv" -notypeinformation -encoding "unicode"

但现在我的 CSV 文件中只有一条记录。我究竟做错了什么?

4

1 回答 1

2

这就是我试图传达的关于构建一个PSCustomObject并将其发送到一个集合的内容。[咧嘴笑]

它能做什么 ...

  • 当准备好对您的数据执行此操作时,伪造读取文本文件
    ,删除整个#region/#endregion块并使用Get-ContentOR 使用Get-ADComputer.
  • 定义报告文件名
  • 定义没有响应时使用什么
  • 遍历计算机名称集合
  • 测试目标是否响应
  • 如果是 = 获取 WMI 磁盘数据
    ,则使用 asplat来提高可读性,而不是一长串参数和值。
  • 如果没有 = 将值设置为$NoResponse
  • 构建PSCO
  • 将其发送到$Results集合
  • 显示在屏幕上
  • 将集合发送到报告文件

编码 ...

#region >>> fake reading in a text file
#    in real life, use Get-Content
$ComputerList = @'
BetterNotBeThere
LocalHost
10.0.0.1
127.0.0.1
'@ -split [System.Environment]::NewLine
#endregion >>> fake reading in a CSV file

$TimeStamp = (Get-Date).ToString('yyyy-MM-dd')
$ReportPath = $env:TEMP
$ReportFile = 'Dmitry Dorofeev_-_DiskSpaceReport_-_{0}.csv' -f $TimeStamp
$FullReportFile = Join-Path -Path $ReportPath -ChildPath $ReportFile

$NoResponse = '__n/a__'

$Results = foreach ($CL_Item in $ComputerList)
    {
    if (Test-Connection -ComputerName $CL_Item -Count 2 -Quiet)
        {
        $GWO_Params = @{
            Class = 'Win32_LogicalDisk'
            ComputerName = $CL_Item
            Filter = "DeviceID = 'c:'"
            }
        $DiskInfo = Get-WmiObject @GWO_Params
        $Size_GB = [math]::Round($DiskInfo.Size / 1gb, 2)
        $FreeSpace_GB = [math]::Round($DiskInfo.FreeSpace / 1gb, 2)
        }
        else
        {
        $Size_GB = $FreeSpace_GB = $NoResponse
        }

    [PSCustomObject]@{
        ComputerName = $CL_Item
        Size_GB = $Size_GB
        FreeSpace_GB = $FreeSpace_GB
        }
    }

# display on screen
$Results

# send to a csv file
$Results |
    Export-Csv -LiteralPath $FullReportFile -NoTypeInformation

屏幕输出...

ComputerName     Size_GB FreeSpace_GB
------------     ------- ------------
BetterNotBeThere __n/a__ __n/a__
LocalHost        931.41  730.79
10.0.0.1         __n/a__ __n/a__
127.0.0.1        931.41  730.79

csv 文件 [ C:\Temp\Dmitry Dorofeev_-_DiskSpaceReport_-_2020-05-22.csv] 内容 ...

"ComputerName","Size_GB","FreeSpace_GB"
"BetterNotBeThere","__n/a__","__n/a__"
"LocalHost","931.41","730.79"
"10.0.0.1","__n/a__","__n/a__"
"127.0.0.1","931.41","730.79"
于 2020-05-22T19:53:07.600 回答