powershell - 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
解决方案
您的问题是 ComputerName 只是一个字符串,但 ClientUserName 和 ClientComputerName 是数组。在数组上调用 .ToString() 可以返回 System.Object[] 输出。
如果 ClientUserName 和 ClientComputerName 具有相同数量的条目并且它们是按顺序关联的,并且每一对对应于父对象中的 ComputerName,我建议使用从 0 到数组长度减一(包括两端)的 for 循环和在每次迭代期间写入一行:$ComputerName、$ClientUserName[$i]、$ClientComputerName[$i]。这里,$i 是 for 循环变量,从 $i = 0 到 $i -lt $ClientUserName.Length
这是假设您希望数组中的条目有单独的行。如果您想要一行,只需在每个数组上使用字符串连接来获得一个分隔(例如,空格或分号或管道)字符串。
推荐阅读
- json - Json 序列化问题(奇数字符)
- java - Spring JPA - 如何计算外键的数量
- javascript - 初始化 server.js,然后在 HTML 页面中调用 Javascript 文件中的函数
- java - 如何读取 CSV 文件,按特定记录过滤并根据记录将其存储在不同的 java 对象中
- javascript - ...(isenvproductionprofile && ^^^ syntaxerror webpack.config.js 中的意外标记
- javascript - 如何使必需属性在 HTML 上的输入上起作用
- jmeter - JMeter 保持恒定的 RPS 速率
- python - 带括号的上下文管理器在 python 3.9 中工作,但不是 3.8
- git - Git、Gitlab 和 Github
- java - 空栈异常