我试图使用Powershell从几个虚拟服务器获取SCSI硬件并获取每个特定服务器的操作系统。 我设法使用我的代码获得特定的SCSI硬件,但是我无法弄清楚如何正确获取每个服务器的操作系统。 此外,我试图发送到csv日志文件中的所有数据,但我不确定如何使PowerShell脚本创build多个列。
这是我的代码(几乎可以工作,但有些不对):
$log = "C:\Users\me\Documents\Scripts\ScsiLog.csv" Get-VM | Foreach-Object { $vm = $_ Get-ScsiController -VM $vm | Where-Object { $_.Type -eq "VirtualBusLogic" } | Foreach-Object { get-VMGuest -VM $vm } | Foreach-Object{ Write-output $vm.Guest.VmName >> $log } }
当我运行这个代码时,我没有收到任何错误,但是每当我运行时,我只得到服务器的名称,而不是操作系统。 此外,我不知道我需要做什么,使操作系统出现在我创build的csv日志中的服务器的名称不同的列中。
我需要在代码中更改以获取每个虚拟机的操作系统版本,并将其输出到我的csv日志文件的不同列中?
编辑:这里有一个更深入的看我已经尝试过的所有失败的事情:
Get-VM | Foreach-Object { $vm = $_ $svm = Get-ScsiController -VM $vm | Where-Object { $_.Type -eq "VirtualBusLogic" } Foreach-Object {get-VMGuest -VM $svm } | Foreach-Object{Write-output $svm >> $log} }
#Get-VM | Foreach-Object { # $vm = $_ # Get-ScsiController -VM $vm | Where-Object { $_.Type -eq "VirtualBusLogic"} #| write-host $vm # | Foreach-Object { # # #get-VMGuest -VM $_ | # #write-host $vm # #get-VMGuest -VM $vm } | Foreach-Object{ # #write-output $vm.VmName >> $log # #write-output $vm.guest.VmName, get-VmGuest -VM $vm >> $log NO GOOD # # Write-host $vm.Guest.VmName #+ get-vmGuest -vm $VM >> $log # # # } # }
我不知道为什么get-VmGuest失败。 我得到了scsi硬件,过滤硬件只得到buslogic,然后想获得只是过滤的VM的操作系统。 我没有看到我的代码虽然失败。
直到最后一行,你们走在正确的轨道上,这是错误的地方。 请记住, $_dynamic地改变了值,而$vm保持了与第3行相同的值。而且,你并没有真正利用stream水线 – 例如: Get-VM | Get-ScsiController Get-VM | Get-ScsiController与此相同:
Get-VM | Foreach-Object { $vm = $_ Get-ScsiController -VM $vm }
我认为你得到报告的最好方法是build立一个未经过滤所有数据的数组,然后把它导出到一个csv,并在excel或其他方面进行过滤/分组等。 除了“OS名称”不是SCSI控制器对象的一个属性之外,上述示例很容易,所以您需要循环并获取它。 但是,结果呢? 没有明显的地方来存储它。 我select将其作为SCSI控制器对象的附加属性进行存储:
$rows = @() $log = "C:\Users\me\Documents\Scripts\ScsiLog.csv" Get-VM | Get-ScsiController | ForEach-Object { $row = $_ $os = (Get-VMGuest -vm $row.parent).OSFullName $row | Add-Member -type NoteProperty -Name OS -Value $os $rows += $row } $rows | select Type, Parent, OS | Export-CSV $log
首先,看起来你已经天真地做了一些可怕的嵌套循环,只需要剪切,粘贴和replace。 考虑一下代码stream。 为什么第三条foreach声明?
对于输出:你真的需要开始学习Powershell,或者说,学习如何学习PowerShell。 谷歌和MS站点将帮助很多,内置的帮助系统也将有所帮助。 把你的整个事情都放到这里(而不是在你的循环中进行追加)
Export-CSV $log
如果你不知道,你可以inputget-help *csv*并find它。