首页 > 解决方案 > 如果 Else Loop 在 Powershell 清单脚本中不起作用

问题描述

注意 - 我不是编码专家,所以请保持温柔 非常感谢任何帮助/指导

问题是我拼凑的 Powershell 脚本无法正常工作。我猜编码大师需要两秒钟的时间来帮助解决。该脚本的基础是它对文本文件中的服务器列表执行基本审计,并将结果输出到 csv。对于每台服务器,它将测试 WMI 连接,如果成功将收集数据列,即名称、IP 地址、正常运行时间等。如果 WMI 连接失败,那么它应该只记录几列数据,即 WMI 结果、Ping 结果等所有结果都应该是管道传输到相同的单个输出 csv

如果列表的 WMI 连接中的第一台服务器成功,则该脚本可以完美运行。为列表中的每个服务器填充所有 16 x 列的 csv 输出文件。 工作示例

如果列表的 WMI 连接中的第一台服务器失败,则输出失败。列表中的每个服务器仅填充 4 x 列的 csv 输出文件。 失败的例子

希望输出csv的截图对您有所帮助

下面的 Powershell 代码

<#

.DESCRIPTION - Auditing Script - Construction Phase !!!

- Create folder called 'Audit' under C:\Temp
- Create text file called 'Servers.txt' and place in newly created C:\Temp\Audit folder
- Servers.txt should contain a list of server names you wish to audit\target

.Author MCD

#>

        ########## Output Folder ##########
        $outputFolderName = 'Audit ' + $(Get-Date -f dd-MM-yyyy)
        $outputpath = "C:\temp\Audit\$outputFolderName"
        If(!(test-path $outputpath))
            {
              New-Item -ItemType Directory -Force -Path $outputpath | out-null
            }
                
        ########## Prompt 1 ##########
        Add-Type -AssemblyName Microsoft.VisualBasic
        $ClientName = [Microsoft.VisualBasic.Interaction]::InputBox('Please enter Client\Customer name i.e. Contoso Ltd', 'User')
        Start-Sleep -s 2

        #Manual Input File Location
        $computers = Get-Content -path c:\temp\audit\Servers.txt
                
        ########## Create an Empty Array ##########
        $report = @()

        ########## Main Start ##########
        Foreach ($Computer in $Computers)
{
    
        ########## WMI/Ping Test ##########
        $wmi = gwmi win32_bios -ComputerName $computer -ErrorAction SilentlyContinue
        $Ping = Test-Connection -ComputerName $computer -Quiet -count 2
        
        ########## Main If Else Loop ##########
        if ($wmi)
    {
        $WMIResult = 'Server IS Contactable' 
                
        ########## HW/Serial No/Bios ##########
        $Bios = Get-WmiObject -Class win32_bios -ComputerName $Computer
        $systemBios = $Bios.serialnumber
        $Hardware = Get-WmiObject -Class Win32_computerSystem -ComputerName $Computer
                        
        ########## OS Version/Last Reboot ##########
        $OS = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $Computer
        $lastBoot = $OS.ConvertToDateTime($OS.LastBootUpTime)
        $uptimeDays = ((get-date) - ($os.ConvertToDateTime($os.lastbootuptime))).Days
        
        ########## Network Info ##########
        $Networks = Get-WmiObject -Class Win32_NetworkAdapterConfiguration -ComputerName $Computer | Where-Object {$_.IPEnabled}
        $IPAddress  = ($Networks.IpAddress | where {$_ -notmatch ":"}) -join "`n"
        $MACAddress  = ($Networks.MACAddress) -join "`n"
        $IpSubnet  = ($Networks.IpSubnet | ? { $_ -match '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}' }) -join "`n"
        $DefaultGateway = ($Networks.DefaultIPGateway) -join "`n"
        
        ########## LastLogon/Created ##########
        $LastLogonDate = Get-ADComputer $computer -Properties * | select -ExpandProperty LastLogonDate 
        $Created = Get-ADComputer $computer -Properties * | select -ExpandProperty Created 
        
            ########## OUTPUT ##########
            $tempreport  = New-Object -TypeName PSObject
            $tempreport | Add-Member -MemberType NoteProperty -Name ServerName -Value $Computer.ToUpper()
            $tempreport | Add-Member -MemberType NoteProperty -Name Client_Customer -Value $ClientName.ToUpper()
            $tempreport | Add-Member -MemberType NoteProperty -Name WMI_Connection -Value $WMIResult
            $tempreport | Add-Member -MemberType NoteProperty -Name Pingable -Value $Ping
            $tempreport | Add-Member -MemberType NoteProperty -Name Manufacturer -Value $Hardware.Manufacturer
            $tempreport | Add-Member -MemberType NoteProperty -Name Model -Value $Hardware.Model
            $tempreport | Add-Member -MemberType NoteProperty -Name Operating_System -Value $OS.Caption
            $tempreport | Add-Member -MemberType NoteProperty -Name IP_Address -Value $IPAddress
            $tempreport | Add-Member -MemberType NoteProperty -Name Default_Gateway -Value $DefaultGateway
            $tempreport | Add-Member -MemberType NoteProperty -Name MAC_Address -Value $MACAddress
            $tempreport | Add-Member -MemberType NoteProperty -Name IpSubnet -Value $IpSubnet
            $tempreport | Add-Member -MemberType NoteProperty -Name Last_ReBoot -Value $lastboot
            $tempreport | Add-Member -MemberType NoteProperty -Name Uptime_Days -Value $uptimeDays
            $tempreport | Add-Member -MemberType NoteProperty -Name Last_Logon -Value $LastLogonDate
            $tempreport | Add-Member -MemberType NoteProperty -Name Created -Value $Created
            $tempreport | Add-Member -MemberType NoteProperty -Name Serial_Number -Value $systemBios
            
            $report += $tempreport
                
    }   else    {
    
        $WMIResult = 'Server NOT Contactable'
                
            $tempreport = New-Object PSObject  
            $tempreport | Add-Member -MemberType NoteProperty -Name ServerName -Value $Computer.ToUpper()
            $tempreport | Add-Member -MemberType NoteProperty -Name Client_Customer -Value $ClientName.ToUpper()
            $tempreport | Add-Member -MemberType NoteProperty -Name WMI_Connection -Value $WMIResult
            $tempreport | Add-Member -MemberType NoteProperty -Name Pingable -Value $Ping
            
            $report += $tempreport  
       
                }
}

        ########## EXPORT TO CSV ##########
        $CSVFileName = $ClientName + ' Server Inventory ' + $(Get-Date -f dd-MM-yyyy) + '.csv'
        $report | Export-Csv "$outputpath\$CSVFileName" -NoTypeInformation


<#

.END

#>

标签: powershell

解决方案


问题是您正在创建的两个对象不包含相同的属性。数组将根据第一个对象中的属性报告信息。因此,如果第一个对象失败,那么所有其他对象将在输出数组时报告相同的四个属性。

我以最简单的方式处理此问题的建议是将附加属性添加到失败的对象,将值设置为$null. 这应该会看到您的 CSV 按预期接收所有属性。

<#
.DESCRIPTION - Auditing Script - Construction Phase !!!
- Create folder called 'Audit' under C:\Temp
- Create text file called 'Servers.txt' and place in newly created C:\Temp\Audit folder
- Servers.txt should contain a list of server names you wish to audit\target
.Author MCD
#>

########## Output Folder ##########
$outputFolderName = 'Audit ' + $(Get-Date -f dd-MM-yyyy)
$outputpath = "C:\temp\Audit\$outputFolderName"
If(!(test-path $outputpath)) {
    New-Item -ItemType Directory -Force -Path $outputpath | out-null
}
                
########## Prompt 1 ##########
Add-Type -AssemblyName Microsoft.VisualBasic
$ClientName = [Microsoft.VisualBasic.Interaction]::InputBox('Please enter Client\Customer name i.e. Contoso Ltd', 'User')
Start-Sleep -s 2

#Manual Input File Location
$computers = Get-Content -path c:\temp\audit\Servers.txt
                
########## Create an Empty Array ##########
$report = @()

########## Main Start ##########
Foreach ($Computer in $Computers) {
    
    ########## WMI/Ping Test ##########
    $wmi = gwmi win32_bios -ComputerName $computer -ErrorAction SilentlyContinue
    $Ping = Test-Connection -ComputerName $computer -Quiet -count 2
        
    ########## Main If Else Loop ##########
    if ($wmi) {
        $WMIResult = 'Server IS Contactable' 
                
        ########## HW/Serial No/Bios ##########
        $Bios = Get-WmiObject -Class win32_bios -ComputerName $Computer
        $systemBios = $Bios.serialnumber
        $Hardware = Get-WmiObject -Class Win32_computerSystem -ComputerName $Computer
                        
        ########## OS Version/Last Reboot ##########
        $OS = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $Computer
        $lastBoot = $OS.ConvertToDateTime($OS.LastBootUpTime)
        $uptimeDays = ((get-date) - ($os.ConvertToDateTime($os.lastbootuptime))).Days
        
        ########## Network Info ##########
        $Networks = Get-WmiObject -Class Win32_NetworkAdapterConfiguration -ComputerName $Computer | Where-Object {$_.IPEnabled}
        $IPAddress  = ($Networks.IpAddress | where {$_ -notmatch ":"}) -join "`n"
        $MACAddress  = ($Networks.MACAddress) -join "`n"
        $IpSubnet  = ($Networks.IpSubnet | ? { $_ -match '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}' }) -join "`n"
        $DefaultGateway = ($Networks.DefaultIPGateway) -join "`n"
        
        ########## LastLogon/Created ##########
        $LastLogonDate = Get-ADComputer $computer -Properties * | select -ExpandProperty LastLogonDate 
        $Created = Get-ADComputer $computer -Properties * | select -ExpandProperty Created 
        
        ########## OUTPUT ##########
        $tempreport  = New-Object -TypeName PSObject
        $tempreport | Add-Member -MemberType NoteProperty -Name ServerName -Value $Computer.ToUpper()
        $tempreport | Add-Member -MemberType NoteProperty -Name Client_Customer -Value $ClientName.ToUpper()
        $tempreport | Add-Member -MemberType NoteProperty -Name WMI_Connection -Value $WMIResult
        $tempreport | Add-Member -MemberType NoteProperty -Name Pingable -Value $Ping
        $tempreport | Add-Member -MemberType NoteProperty -Name Manufacturer -Value $Hardware.Manufacturer
        $tempreport | Add-Member -MemberType NoteProperty -Name Model -Value $Hardware.Model
        $tempreport | Add-Member -MemberType NoteProperty -Name Operating_System -Value $OS.Caption
        $tempreport | Add-Member -MemberType NoteProperty -Name IP_Address -Value $IPAddress
        $tempreport | Add-Member -MemberType NoteProperty -Name Default_Gateway -Value $DefaultGateway
        $tempreport | Add-Member -MemberType NoteProperty -Name MAC_Address -Value $MACAddress
        $tempreport | Add-Member -MemberType NoteProperty -Name IpSubnet -Value $IpSubnet
        $tempreport | Add-Member -MemberType NoteProperty -Name Last_ReBoot -Value $lastboot
        $tempreport | Add-Member -MemberType NoteProperty -Name Uptime_Days -Value $uptimeDays
        $tempreport | Add-Member -MemberType NoteProperty -Name Last_Logon -Value $LastLogonDate
        $tempreport | Add-Member -MemberType NoteProperty -Name Created -Value $Created
        $tempreport | Add-Member -MemberType NoteProperty -Name Serial_Number -Value $systemBios
            
        $report += $tempreport
                
    }
    else {
    
        $WMIResult = 'Server NOT Contactable'
                
        $tempreport = New-Object PSObject  
        $tempreport | Add-Member -MemberType NoteProperty -Name ServerName -Value $Computer.ToUpper()
        $tempreport | Add-Member -MemberType NoteProperty -Name Client_Customer -Value $ClientName.ToUpper()
        $tempreport | Add-Member -MemberType NoteProperty -Name WMI_Connection -Value $WMIResult
        $tempreport | Add-Member -MemberType NoteProperty -Name Pingable -Value $Ping
        $tempreport | Add-Member -MemberType NoteProperty -Name Manufacturer -Value $null
        $tempreport | Add-Member -MemberType NoteProperty -Name Model -Value $null
        $tempreport | Add-Member -MemberType NoteProperty -Name Operating_System -Value $null
        $tempreport | Add-Member -MemberType NoteProperty -Name IP_Address -Value $null
        $tempreport | Add-Member -MemberType NoteProperty -Name Default_Gateway -Value $null
        $tempreport | Add-Member -MemberType NoteProperty -Name MAC_Address -Value $null
        $tempreport | Add-Member -MemberType NoteProperty -Name IpSubnet -Value $null
        $tempreport | Add-Member -MemberType NoteProperty -Name Last_ReBoot -Value $null
        $tempreport | Add-Member -MemberType NoteProperty -Name Uptime_Days -Value $null
        $tempreport | Add-Member -MemberType NoteProperty -Name Last_Logon -Value $null
        $tempreport | Add-Member -MemberType NoteProperty -Name Created -Value $null
        $tempreport | Add-Member -MemberType NoteProperty -Name Serial_Number -Value $null
            
        $report += $tempreport  
    }
}

########## EXPORT TO CSV ##########
$CSVFileName = $ClientName + ' Server Inventory ' + $(Get-Date -f dd-MM-yyyy) + '.csv'
$report | Export-Csv "$outputpath\$CSVFileName" -NoTypeInformation

推荐阅读