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

通过Powershell将信息输出到电子表格,powershell,active-directory,spreadsheet,code-cleanup,Powershell,Active Directory,Spreadsheet,Code Cleanup,我有一个清理脚本,我打算通过使用active directory来清理数百个虚拟服务器。过去,我会创建一个简单的.txt文件,该文件将显示以下内容: -运行脚本之前存在的磁盘空间量 -运行后有多少空间 -已清除的总空间 在过去,这非常有效,但是它打算一次在一台服务器上使用,而不是在数百台服务器上使用。因为我想改变一下,一次在数百个脚本上运行这个脚本,所以我想把它改成一个电子表格,它将显示相同的数据,并显示运行脚本的每个服务器的名称 我如何能够以电子表格格式创建这种类型的输出并显示它?以下是我当前

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

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

-运行后有多少空间

-已清除的总空间

在过去,这非常有效,但是它打算一次在一台服务器上使用,而不是在数百台服务器上使用。因为我想改变一下,一次在数百个脚本上运行这个脚本,所以我想把它改成一个电子表格,它将显示相同的数据,并显示运行脚本的每个服务器的名称

我如何能够以电子表格格式创建这种类型的输出并显示它?以下是我当前的代码(txt方法):


提前谢谢

我会这样做:

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

我编写了类似这样的内容,可在1700个虚拟机上运行。我查看了所有选项,立即排除了其中两个选项:

  • PowerCLI(VMware PowerShell模块),因为我希望我的脚本能够跨Hyper Visors工作
  • WMI(获取WMIObject)它太不可靠。这真是一帆风顺
所以我决定使用invoke命令:

$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:\驱动器如果你想检查所有驱动器a,请留下评论,我会修改它。

嗨,克里斯,谢谢你的建议!关于您所说的手动运行,您知道默认gwmi超时的频率吗?我计划最终使这个脚本自动运行。这取决于您的环境。也许你所有的服务器都是健康的。我的从来都不是。试试这个:-另外,在让它开始WMI检查之前,你可能想在那里抛出一个If(testconnection$\uquiet){type检查。嗨,Taylor,因为我计划在很多服务器上运行这个,这正是我想要的,以避免超时。不过,有一个问题,你的代码是不是一个接一个地通过每台服务器(由于使用了foreach)或者有没有一种方法可以让它一次通过所有的虚拟机?我的大部分代码在运行时需要20-30分钟,如果它必须每周通过几百台服务器(计划将其自动化)然后需要非常长的时间才能完成运行。这个脚本是在PowerShell 2中编写的。因此,在您正确的时候,它会迭代每个服务器。这里有两个选项,如果您需要使用PowerShell 2,您可以使用-AsJob参数,它只会为每个VM生成一个新线程,如果您在运行它,这可能有点疯狂例如,它针对1000台服务器。这是PowerShell目前的一个限制。但是PowerShell v3引入了工作流,允许您并行执行脚本,并在需要重新启动时检查它们!我认为您需要使用PowerShell 2,如果solet me知道,如果您支持我,我将尝试修改我的脚本尽我所能帮助您:)谢谢Taylor!我现在正在使用Powershell 2,因此我知道当前的限制。我以前没有听说过-AsJob参数,但是我会研究它(无论如何,出于好奇:-))。还有一件事,在进行测试时,我注意到由于某种原因,创建的电子表格完全是空的。我不知道为什么,$MachineInfo并没有填充任何内容。
$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"