通过Powershell将信息输出到电子表格

时间:2012-08-10 18:43:20

标签: powershell active-directory spreadsheet code-cleanup

我有一个清理脚本,我打算通过使用活动目录来清理数百个虚拟服务器。在过去,我会创建一个简单的.txt文件,显示以下内容:

- 运行脚本之前存在的大量磁盘空间

- 运行后有多少空间

- 总空间已清除

过去这种方法效果很好,但它的目的是一次只能在一台服务器上使用,而不是数百台。由于我想要改为同时在数百个脚本上运行此脚本,我想将其更改为电子表格,该电子表格将显示相同的数据以及显示脚本运行的每个服务器的名称。

我如何设法以电子表格格式创建此类输出并显示?这是我当前的代码(.txt方法):

$logFilePath = "C:\logfile.txt"
$disks = Get-WMIObject -Computer $server -Class Win32_LogicalDisk -Filter "DeviceID like '%C%'"
$beforeFreeSpace = $disks.FreeSpace
$beforeFreeSpaceMB = [math]::truncate($beforeFreeSpace / 1MB)

$preCleanupMessage = "Space available before cleanup ran (MB): "
$preCleanupMessage += $beforeFreeSpaceMB
$preCleanupMessage | out-file -filePath $logFilePath -Append

$afterFreeSpace = $disks.FreeSpace
$afterFreeSpaceMB = [math]::truncate($afterFreeSpace / 1MB)

$freedSpace = "Freed up space after cleanup (MB): "
$freedSpace += $afterFreeSpaceMB - $beforeFreeSpaceMB

$freedSpace | out-file -filePath $logFilePath -Append
$message = "Free space remaining after cleanup (in MB): "
$message += [math]::truncate($afterFreeSpace / 1MB)
$message | out-file -filePath $logFilePath -Append

提前致谢!

2 个答案:

答案 0 :(得分:1)

我会做这样的事情:

$Servers = "server1","server2"
$logFileCollection = @()

$servers | % {
    Write-Host Working on $_
    $server = $_
    $disk = Get-WMIObject -Computer $server -Class Win32_LogicalDisk -Filter "DeviceID like '%C%'"
    $beforeFreeSpaceMB = [math]::truncate($disk.FreeSpace / 1MB)
    #DO SOME WORK HERE TO FREE UP SPACE
    $logFileCollection += New-Object -Type PSObject -Property @{
        beforeFreeSpaceMB = $beforeFreeSpaceMB
        afterFreeSpaceMB = [math]::truncate($disks.FreeSpace / 1MB)
        freedSpace = [math]::truncate($disks.FreeSpace / 1MB) - $beforeFreeSpaceMB
    }
}

$logFileCollection | Export-CSV -NoTypeInformation "C:\logCSV.csv"

另外,请记住,默认的gwmi cmdlet可能会超时,您可能需要解决此问题。祝好运。此外,手动运行此操作,如果您必须在任何时候中止脚本,只需运行最后一行即可获得输出。

答案 1 :(得分:1)

我写了类似于1700个虚拟机的内容。我查看了所有选项,并立即排除了其中两个:

  • PowerCLI(VMware PowerShell模块),因为我希望我的脚本可以跨Hyper-Visors工作。
  • WMI(Get-WMIObject)太不可靠了。它真的很受欢迎。

所以我决定使用invoke-command:

$VMList = "server1","server2"
$MachineInfo = @()

foreach($VM in $VMList)
{
   $MachineInfo += Invoke-Command $VM{
   $obj = New-Object PSObject
   $Drive = Get-PSDrive | Where {$_.Name -eq "C"}
   $beforeFreeSpace = $Drive.Free
   $beforeFreeSpaceMB = [Math]::Round(($Drive.Free /1024) /1024)
   $obj | Add-Member -Name "BeforeFreeSpace" -MemberType NoteProperty -Value $beforeFreeSpaceMB

   ## Clean Up Over Here

   $Drive = Get-PSDrive | Where {$_.Name -eq "C"}
   $afterFreeSpace = $Drive.Free
   $afterFreeSpaceMB = [Math]::Round(($Drive.Free /1024) /1024)
   $obj | Add-Member -Name "AfterFreeSpace" -MemberType NoteProperty -Value $afterFreeSpaceMB

   $freedSpace = $obj.AfterFreeSpace - $obj.BeforeFreeSpace
   $obj | Add-Member -Name "FreedSpace" -MemberType NoteProperty -Value $freedSpace

   return $obj}
}

$MachineInfo | Export-CSV -NoTypeInformation "C:\log.csv"

现在已经工作了大约2个月了,我也修改了我发布的版本,只检查你的C:\驱动器,如果你想检查所有驱动器,只需留下评论并修改它。