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