我正在尝试使用 Powershell 从多个虚拟服务器获取 SCSI 硬件并获取每个特定服务器的操作系统。我已设法使用我的代码获取我想要查找的特定 SCSI 硬件,但是我无法弄清楚如何正确获取每个服务器的操作系统。此外,我正在尝试将我找到的所有数据发送到 csv 日志文件中,但是我不确定如何让 powershell 脚本创建多个列。
这是我的代码(几乎可以工作,但是有些错误):
$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
}
}
运行此代码时我没有收到任何错误,但是每次运行它时我都只获取服务器的名称而不是操作系统。此外,我不确定我需要做什么才能使操作系统出现在我正在创建的 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,然后想要获取仅过滤后的虚拟机的操作系统。不过,我不明白我的代码在哪里失败了。
答案1
直到最后一行,你都走在正确的轨道上,但最后一行却出了问题。请记住,$_
动态更改值,而$vm
保持与第 3 行相同的值。此外,你并没有真正利用流水线——例如:这样
Get-VM | Get-ScsiController
做与此相同:
Get-VM | Foreach-Object {
$vm = $_
Get-ScsiController -VM $vm
}
我认为获取报告的最佳方式是构建一个包含所有数据的数组未过滤,然后将其导出到 csv 并在 excel 或其他程序中进行过滤/分组/等。仅使用上面的例子就很容易了,只是“OS Name”不是 SCSI Controller 对象的属性,因此您需要循环并获取它。但是如何处理结果呢?没有明显的地方可以存储它。我选择将其存储为 SCSI Controller 对象的附加属性:
$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
答案2
首先,看起来你只是通过剪切粘贴和替换就天真地创建了一些可怕的嵌套循环。想想代码流程。为什么是第三个 foreach 语句?
输出:你真的需要开始学习 Powershell,或者更确切地说,学习如何学习 powershell。Google 和 MS 网站会提供很大帮助,就像内置帮助系统。将整个内容导入其中(而不是在循环中间附加)
Export-CSV $log
如果您不知道,您可以输入get-help *csv*
并查找它。