我有一个脚本,它扫描我域中的所有服务器,并输出到两个单独的CSV文件——一个简单,一个广泛。
我一次只在csv中写一行。。这导致数千个文件打开和关闭。。我一直潜伏在周围,明白我应该首先收集所有信息,并在剧本结束时一气呵成。但是我该如何使用导出csv(最好使用函数)呢?
有没有一种方法可以对短列表和长列表使用相同的函数?
该脚本在每个域/服务器上执行许多任务,但为了您的观看乐趣,我将其精简为:
$domains = "no","se","dk"
# Loop through specified forests
foreach ($domain in $domains) {
# List all servers
$servers = Get-QADComputer
# Looping through the servers
foreach ($server in $servers) {
# GENERATE LONGLIST #
# Ping server
if (Test-Connection -ComputerName $server.name -count 1 -Quiet )
{
$Reachable = "Yes"
# Fetch IP address
$ipaddress = [System.Net.Dns]::GetHostAddresses($Server.name)|select-object IPAddressToString -expandproperty IPAddressToString
# Formatting output and export all info to CSV
New-Object -TypeName PSObject -Property @{
SystemName = ($server.name).ToLower()
Reachable = $Reachable
Domain = $server.domain
IPAddress = $IPAddress
} | Select-Object SystemName,Domain,IPAddress| Export-Csv -Path "longexport.csv" -append
}
else # Can't reach server
{
$reachable = "No"
$IPAddress = "Unknown"
# Formatting output and export all info to CSV
New-Object -TypeName PSObject -Property @{
SystemName = ($server.name).ToLower()
Reachable = $Reachable
Domain = $server.domain
} | Select-Object SystemName,Domain,IPAddress| Export-Csv -Path "shortexport.csv" -append
}
}
}
(我只想说,我知道我不能用export csv进行-append,但我使用的是一个让我来做这件事的函数。)
您将相同数量的属性导出到每个文件,所以我不确定为什么其中一个属性被认为是长的,另一个属性是短的。无论如何,我建议如下,不要将所有计算机都分配给一个变量,它可能会占用大量RAM,而是使用流方式(一次一个对象)并使用foreach对象。此外,由于我在每个域操作结束时(每个域一个)输出到文件的文件中没有发现任何差异。而对于另一个twick,你只能向文件写入一次。
$domains = "no","se","dk"
foreach ($domain in $domains) {
Get-QADComputer -Service $domain -SizeLimit 0 | Foreach-Object {
$reachable = Test-Connection -ComputerName $_.Name -count 1 -Quiet
if($reachable)
{
$IPAddress = [System.Net.Dns]::GetHostAddresses($_.Name)|select-object IPAddressToString -expandproperty IPAddressToString
}
else
{
$IPAddress = $null
}
New-Object -TypeName PSObject -Property @{
SystemName = $_.Name.ToLower()
Reachable = $reachable
Domain = $_.Domain
IPAddress = $IPAddress
} | Select-Object SystemName,Domain,IPAddress
} | Export-Csv -Path export.csv -Append
}
您需要将数据保存在内存中,以防止打开/关闭多个文件。
您可以通过将数据添加到这样的数组中来做到这一点:
$myData = @()
$myData += New-Object -TypeName PSObject -Property @{
SystemName = ($server.name).ToLower()
Reachable = $Reachable
Domain = $server.domain
} | Select-Object SystemName,Domain,IPAddress
然后在处理结束时,使用$myData | ConvertTo-CSV | Out-File C:Data.csv
或仅使用$myData | Export-Csv C:Data.csv
将数组转换为CSV。