CSV Powershell的服务器列表操作系统类型
快速提问,我希望能够拉一个大的服务器列表,并将带有服务器名称的操作系统类型放入CSV文件中。我已经让这个脚本在很大程度上做到了这一点,但是我遇到了一些问题CSV Powershell的服务器列表操作系统类型,powershell,csv,Powershell,Csv,快速提问,我希望能够拉一个大的服务器列表,并将带有服务器名称的操作系统类型放入CSV文件中。我已经让这个脚本在很大程度上做到了这一点,但是我遇到了一些问题 除非csv中已经有列,否则脚本将失败,我感觉我不正确地使用了append标志 该列表可能包含Linux、Sun系统、旧版win 2003和其他非windows系统。因此,将要发生错误,当前它只是跳过csv中的一行。有没有办法在操作系统字段中写入服务器名称和“失败”一词?或者只是在一般情况下禁用错误 提前感谢您的帮助 $servers = Ge
$servers = Get-Content C:\Automation\Servers.txt
Foreach ($s in $servers)
{
$OSInfo = Get-WmiObject Win32_OperatingSystem -ComputerName $s #Get OS Information
$infoObject = New-Object PSObject
Add-Member -inputObject $infoObject -memberType NoteProperty -name "ServerName" -value $CPUInfo.SystemName
Add-Member -inputObject $infoObject -memberType NoteProperty -name "OS_Name" -value $OSInfo.Caption
$infoObject | Export-Csv -NoTypeInformation -Append -Path C:\Automation\test.csv
}
如果使用try-catch,则可以更轻松地处理错误情况,因此我将开始检查代码的以下更改:
$servers = Get-Content C:\Automation\Servers.txt
$output = @()
foreach ($s in $servers)
{
$infoObject = New-Object PSObject
try {
$OSInfo = Get-WmiObject Win32_OperatingSystem -ComputerName $s
Add-Member -inputObject $infoObject -memberType NoteProperty -name 'ServerName' -value $s
Add-Member -inputObject $infoObject -memberType NoteProperty -name 'OS_Name' -value $OSInfo.Caption
}
catch {
Add-Member -inputObject $infoObject -memberType NoteProperty -name 'ServerName' -value $s
Add-Member -inputObject $infoObject -memberType NoteProperty -name 'OS_Name' -value 'Non-Windows'
}
$output += $infoObject
}
$output | Export-Csv -NoTypeInformation -Path c:\Automation\test.csv
除了try-catch之外,这里的一个变化是我创建了一个空数组,并收集其中的所有infoObjects,最后只导出一个csv。这样,您就不会遇到csv的问题。我还将$s用于servername,这样即使WMI查询失败,您也可以获得servername。如果WMI失败,您还可以为任何服务器获取“非Windows”。如果愿意,您可以将其更改为“WMI失败”或其他内容,因为它当然也可能在windows服务器上失败
注意!我还没有实际测试过这段代码,但它应该会给你一些工作。您还可以研究其他一些东西来对其进行优化,例如使用WMI查询,还有更简单的方法来创建PSObject,但是由于您的PSObject只有两个属性,所以它就没有那么重要了
希望这有帮助。祝您好运。如果您使用try-catch,您可以更轻松地处理错误情况,因此我将开始检查代码的以下更改:
$servers = Get-Content C:\Automation\Servers.txt
$output = @()
foreach ($s in $servers)
{
$infoObject = New-Object PSObject
try {
$OSInfo = Get-WmiObject Win32_OperatingSystem -ComputerName $s
Add-Member -inputObject $infoObject -memberType NoteProperty -name 'ServerName' -value $s
Add-Member -inputObject $infoObject -memberType NoteProperty -name 'OS_Name' -value $OSInfo.Caption
}
catch {
Add-Member -inputObject $infoObject -memberType NoteProperty -name 'ServerName' -value $s
Add-Member -inputObject $infoObject -memberType NoteProperty -name 'OS_Name' -value 'Non-Windows'
}
$output += $infoObject
}
$output | Export-Csv -NoTypeInformation -Path c:\Automation\test.csv
除了try-catch之外,这里的一个变化是我创建了一个空数组,并收集其中的所有infoObjects,最后只导出一个csv。这样,您就不会遇到csv的问题。我还将$s用于servername,这样即使WMI查询失败,您也可以获得servername。如果WMI失败,您还可以为任何服务器获取“非Windows”。如果愿意,您可以将其更改为“WMI失败”或其他内容,因为它当然也可能在windows服务器上失败
注意!我还没有实际测试过这段代码,但它应该会给你一些工作。您还可以研究其他一些东西来对其进行优化,例如使用WMI查询,还有更简单的方法来创建PSObject,但是由于您的PSObject只有两个属性,所以它就没有那么重要了
希望这有帮助。祝您好运。如果您使用try-catch,您可以更轻松地处理错误情况,因此我将开始检查代码的以下更改:
$servers = Get-Content C:\Automation\Servers.txt
$output = @()
foreach ($s in $servers)
{
$infoObject = New-Object PSObject
try {
$OSInfo = Get-WmiObject Win32_OperatingSystem -ComputerName $s
Add-Member -inputObject $infoObject -memberType NoteProperty -name 'ServerName' -value $s
Add-Member -inputObject $infoObject -memberType NoteProperty -name 'OS_Name' -value $OSInfo.Caption
}
catch {
Add-Member -inputObject $infoObject -memberType NoteProperty -name 'ServerName' -value $s
Add-Member -inputObject $infoObject -memberType NoteProperty -name 'OS_Name' -value 'Non-Windows'
}
$output += $infoObject
}
$output | Export-Csv -NoTypeInformation -Path c:\Automation\test.csv
除了try-catch之外,这里的一个变化是我创建了一个空数组,并收集其中的所有infoObjects,最后只导出一个csv。这样,您就不会遇到csv的问题。我还将$s用于servername,这样即使WMI查询失败,您也可以获得servername。如果WMI失败,您还可以为任何服务器获取“非Windows”。如果愿意,您可以将其更改为“WMI失败”或其他内容,因为它当然也可能在windows服务器上失败
注意!我还没有实际测试过这段代码,但它应该会给你一些工作。您还可以研究其他一些东西来对其进行优化,例如使用WMI查询,还有更简单的方法来创建PSObject,但是由于您的PSObject只有两个属性,所以它就没有那么重要了
希望这有帮助。祝您好运。如果您使用try-catch,您可以更轻松地处理错误情况,因此我将开始检查代码的以下更改:
$servers = Get-Content C:\Automation\Servers.txt
$output = @()
foreach ($s in $servers)
{
$infoObject = New-Object PSObject
try {
$OSInfo = Get-WmiObject Win32_OperatingSystem -ComputerName $s
Add-Member -inputObject $infoObject -memberType NoteProperty -name 'ServerName' -value $s
Add-Member -inputObject $infoObject -memberType NoteProperty -name 'OS_Name' -value $OSInfo.Caption
}
catch {
Add-Member -inputObject $infoObject -memberType NoteProperty -name 'ServerName' -value $s
Add-Member -inputObject $infoObject -memberType NoteProperty -name 'OS_Name' -value 'Non-Windows'
}
$output += $infoObject
}
$output | Export-Csv -NoTypeInformation -Path c:\Automation\test.csv
除了try-catch之外,这里的一个变化是我创建了一个空数组,并收集其中的所有infoObjects,最后只导出一个csv。这样,您就不会遇到csv的问题。我还将$s用于servername,这样即使WMI查询失败,您也可以获得servername。如果WMI失败,您还可以为任何服务器获取“非Windows”。如果愿意,您可以将其更改为“WMI失败”或其他内容,因为它当然也可能在windows服务器上失败
注意!我还没有实际测试过这段代码,但它应该会给你一些工作。您还可以研究其他一些东西来对其进行优化,例如使用WMI查询,还有更简单的方法来创建PSObject,但是由于您的PSObject只有两个属性,所以它就没有那么重要了
希望这有帮助。祝您好运。您可以设置
$ErrorActionPreference='SilentlyContinue'
使获取WmiObject
忽略错误。另外,-ComputerName
参数接受主机名数组,因此无需在循环中运行cmdlet并多次附加到输出文件
$serverlist='C:\Automation\Servers.txt'
$oslist='C:\Automation\test.csv'
$servers=获取内容$serverlist
$ErrorActionPrefSave=$ErrorActionPreference
$ErrorActionPreference='SilentlyContinue'
$OSInfo=获取WmiObject-类Win32_操作系统-计算机$servers|
选择@{n='Computer';e={$\uu.\uu SERVER}},
@{n='OS_Name';e={$\u.Caption}
$ErrorActionPreference=$ErrorActionPrefSave
#将响应写入输出文件
$OSInfo |导出Csv$oslist-NoType
#筛选从服务器列表响应的主机并附加其余主机
#(未响应的)并向输出文件发送失败通知
$servers |?{$OSInfo.Computer-notcontains$}|
选择{n='Computer';e={${},@{n='OS_Name';e={'connection failed'}|
导出Csv$oslist-NoType-Append
请注意,$OSInfo.Computer-notcontains$\ucode>需要PowerShell v3或更高版本。对于早期的PowerShell版本,您需要将其更改为