CSV Powershell的服务器列表操作系统类型

CSV Powershell的服务器列表操作系统类型,powershell,csv,Powershell,Csv,快速提问,我希望能够拉一个大的服务器列表,并将带有服务器名称的操作系统类型放入CSV文件中。我已经让这个脚本在很大程度上做到了这一点,但是我遇到了一些问题 除非csv中已经有列,否则脚本将失败,我感觉我不正确地使用了append标志 该列表可能包含Linux、Sun系统、旧版win 2003和其他非windows系统。因此,将要发生错误,当前它只是跳过csv中的一行。有没有办法在操作系统字段中写入服务器名称和“失败”一词?或者只是在一般情况下禁用错误 提前感谢您的帮助 $servers = Ge

快速提问,我希望能够拉一个大的服务器列表,并将带有服务器名称的操作系统类型放入CSV文件中。我已经让这个脚本在很大程度上做到了这一点,但是我遇到了一些问题

  • 除非csv中已经有列,否则脚本将失败,我感觉我不正确地使用了append标志
  • 该列表可能包含Linux、Sun系统、旧版win 2003和其他非windows系统。因此,将要发生错误,当前它只是跳过csv中的一行。有没有办法在操作系统字段中写入服务器名称和“失败”一词?或者只是在一般情况下禁用错误
  • 提前感谢您的帮助

    $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版本,您需要将其更改为