首页 > 解决方案 > System.Object[] - 导出为 CSV

问题描述

您能否帮助更正以下脚本的输出?

脚本 :

# Computer List
$allComputers = Get-Content '.\path\to\computers.txt'



# get credentials for domain-joined machines and for local machines
$domainCred = Get-Credential -UserName "domain01\admin01" -Message "Please enter the DOMAIN password"
#$localCred  = Get-Credential -UserName "localadmin01" -Message "Please enter the LOCAL password"

# loop through the list of computers and collect output in variable $Results
$Results = foreach($computer in $allComputers) {
    # check if server is pingable before running the query on the server
    if (Test-Connection -ComputerName $computer -Count 1 -Quiet) {  
        Write-Host "$computer is online!" -BackgroundColor Green -ForegroundColor Black

        $server = Get-ADComputer -Filter "dnshostname -eq '$computer'" -Properties OperatingSystem -ErrorAction SilentlyContinue
        # if domain joined, use $domainCred, otherwise $localCred
        if ($server) { 
            $cred    = $domainCred
            $version = ([regex]'Windows(?: Server)?[^\w\r\n]+(\w+)').Match($server.OperatingSystem).Groups[1].Value
        } 
        else { 
            $cred    = $localCred
            $info    = Get-WmiObject -ComputerName $computer -Credential $cred -Class Win32_OperatingSystem
            $version = ([regex]'Windows(?: Server)?[^\w\r\n]+(\w+)').Match($info.Caption).Groups[1].Value
        }


        if ($version -eq '2016') {



          # Newer OS
            $SMB = Invoke-Command -ComputerName $computer -Credential $cred -ScriptBlock { Get-SmbSession | Select-Object ClientUserName, ClientComputerName }
            # output an object
            [PsCustomObject]@{ ComputerName = $computer; ClientUserName = $SMB.ClientUserName ; ClientComputerName = $SMB.ClientComputerName }
        }
        
                elseif ($version -eq '2012') {



          # Newer OS
            $SMB = Invoke-Command -ComputerName $computer -Credential $cred -ScriptBlock { Get-SmbSession | Select-Object ClientUserName, ClientComputerName }
            # output an object
            [PsCustomObject]@{ ComputerName = $computer; ClientUserName = $SMB.ClientUserName ; ClientComputerName = $SMB.ClientComputerName }
        }
        
                elseif ($version -eq '2019') {



          # Newer OS
            $SMB = Invoke-Command -ComputerName $computer -Credential $cred -ScriptBlock { Get-SmbSession | Select-Object ClientUserName, ClientComputerName }
            # output an object
            [PsCustomObject]@{ ComputerName = $computer; ClientUserName = $SMB.ClientUserName ; ClientComputerName = $SMB.ClientComputerName }
        }
        
                        elseif ($version -eq '10') {



          # Newer OS
            $SMB = Invoke-Command -ComputerName $computer -Credential $cred -ScriptBlock { Get-SmbSession | Select-Object ClientUserName, ClientComputerName }
            # output an object
            [PsCustomObject]@{ ComputerName = $computer; ClientUserName = $SMB.ClientUserName ; ClientComputerName = $SMB.ClientComputerName }
        }
}
    else {
        Write-Warning "Computer $computer is off-line"
        
        [PsCustomObject]@{ ComputerName = $computer; SMB1Enabled = 'Off-Line' }
    }

}       

# Output on screen
$Results | Format-Table -AutoSize

# Output to CSV file
$Results | Export-Csv -Path 'c:\temp\smbsession.csv' -NoTypeInformation -UseCulture

结果变量:

ComputerName ClientUserName                                                       ClientComputerName                                           
------------ --------------                                                       ------------------                                           
COMPUTER01   {CONTOSO\machine01$, CONTOSO\machine02,...}                          {192.10.12.1, 192.10.12.3,...}

我的输出:

输出 :

"ComputerName","ClientUserName","ClientComputerName"
"COMPUTER01","System.Object[]","System.Object[]"

我的最后一个输出:

"ComputerName","ClientUserName","ClientComputerName"
"COMPUTER01","CONTOSO\machine01$;CONTOSO\machine02;  192.10.12.1; 192.10.12.3

标签: powershell

解决方案


您的问题是 ComputerName 只是一个字符串,但 ClientUserName 和 ClientComputerName 是数组。在数组上调用 .ToString() 可以返回 System.Object[] 输出。

如果 ClientUserName 和 ClientComputerName 具有相同数量的条目并且它们是按顺序关联的,并且每一对对应于父对象中的 ComputerName,我建议使用从 0 到数组长度减一(包括两端)的 for 循环和在每次迭代期间写入一行:$ComputerName、$ClientUserName[$i]、$ClientComputerName[$i]。这里,$i 是 for 循环变量,从 $i = 0 到 $i -lt $ClientUserName.Length

这是假设您希望数组中的条目有单独的行。如果您想要一行,只需在每个数组上使用字符串连接来获得一个分隔(例如,空格或分号或管道)字符串。


推荐阅读