0

我有一个清理脚本,打算通过使用活动目录来清理数百个虚拟服务器。在过去,我会创建一个简单的 .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

提前致谢!

4

2 回答 2

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 可能会超时,您可能需要解决这个问题。祝你好运。此外,手动运行它,如果您必须在任何时候中止脚本,只需运行最后一行以获取该点的输出。

于 2012-08-10T19:54:37.453 回答
1

我写了类似这样的东西,可以运行 1700 个虚拟机。我查看了所有选项,并立即排除了其中两个:

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

所以我决定使用调用命令:

$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:\ 驱动器,如果你想检查所有驱动器,只需发表评论并修改它。

于 2012-08-11T13:04:15.037 回答