Powershell 通过几个foreach收集信息,然后在脚本末尾导出csv
我有一个脚本,可以扫描我域中的所有服务器,并输出到两个单独的CSV文件——一个简单文件和一个扩展文件 我一次只在csv上写一行。。这将导致数千个文件打开和关闭。。我一直在四处游荡,我明白我应该首先收集所有信息,然后在脚本末尾一次将它们全部写下来。但是我如何使用函数导出csv呢 有没有一种方法可以对短列表和长列表使用相同的函数 该脚本在每个域/服务器上执行许多任务,但为了便于查看,我将其精简为:Powershell 通过几个foreach收集信息,然后在脚本末尾导出csv,powershell,foreach,export-to-csv,Powershell,Foreach,Export To Csv,我有一个脚本,可以扫描我域中的所有服务器,并输出到两个单独的CSV文件——一个简单文件和一个扩展文件 我一次只在csv上写一行。。这将导致数千个文件打开和关闭。。我一直在四处游荡,我明白我应该首先收集所有信息,然后在脚本末尾一次将它们全部写下来。但是我如何使用函数导出csv呢 有没有一种方法可以对短列表和长列表使用相同的函数 该脚本在每个域/服务器上执行许多任务,但为了便于查看,我将其精简为: $domains = "no","se","dk" # Loop through specified
$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进行追加,但我使用的是一个函数,让我来实现这一点。您需要将数据保存在内存中,以防止多个文件打开/关闭 您可以通过将数据添加到如下数组来完成此操作:
$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。您需要将数据保存在内存中以防止多个文件打开/关闭 您可以通过将数据添加到如下数组来完成此操作:
$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。您将相同数量的属性导出到每个文件,因此我不确定我是否理解其中一个属性被视为长而另一个短。无论如何,我建议如下,不要将所有计算机分配给一个变量,它可能会占用大量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
}
您将相同数量的属性导出到每个文件,因此我不确定我是否理解其中一个属性被视为长属性,另一个属性被视为短属性。无论如何,我建议如下,不要将所有计算机分配给一个变量,它可能会占用大量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
}
非常感谢。Long ping服务器,short不ping服务器。我忘了从选择对象中删除IPAddress:有没有其他方法可以从同一对象中选择对象?还有一件事。。我在$servers.length变量的帮助下显示一个状态栏。我可以用这种方法做类似的事情吗?您可以将新对象保存到一个变量中,并通过管道将其选中,每次选择不同的属性。关于$servers.length,您不能显示它的长度,因为您一次只处理一个名称。您可以创建一个变量并在每次迭代中递增它,并显示它的值。非常感谢您对Shay的解释!但是我确实有个问题。。实际上,我在以前的$servers循环中写入了三个不同的CSV。您的方法可以做到这一点吗?将所有信息写入一个文件如何?脚本结束后,您将读回该文件,并根据您的标准为每个场景选择所需的属性,然后将其导出到单独的文件中?谢谢!Long ping服务器,short不ping服务器。我忘了从选择对象中删除IPAddress:有没有其他方法可以从同一对象中选择对象?还有一件事。。我在$servers.length变量的帮助下显示一个状态栏。我可以用这种方法做类似的事情吗?您可以将新对象保存到一个变量中,并通过管道将其选中,每次选择不同的属性。关于$servers.length,您不能显示它的长度,因为您一次只处理一个名称。您可以创建一个变量并在每次迭代中递增它,并显示它的值。非常感谢您对Shay的解释!但是我确实有个问题。。实际上,我在以前的$servers循环中写入了三个不同的CSV。您的方法可以做到这一点吗?将所有信息写入一个文件,当脚本结束时,您读回该文件,并根据您的标准为每个场景选择所需的属性,然后将其导出到一个单独的文件中。谢谢Andy!数组的工作方式是否与psobject类似?对不起,如果这是一个noob问题,但我有点noob:@Sune没问题,我们都从某个地方开始;-将数组想象为内存中的一个存储桶,可以存储PSObject。PSObject是单个对象,其中数组是对象的集合。+=运算符将新的PSobject添加到列表中。当循环完成时,你将得到一个充满PSObject的数组。这是一个很好的解决方案,但我选择Shay的是因为RAM问题。非常感谢你的邀请
不过我们的解释是:谢谢你,安迪!数组的工作方式是否与psobject类似?对不起,如果这是一个noob问题,但我有点noob:@Sune没问题,我们都从某个地方开始;-将数组想象为内存中的一个存储桶,可以存储PSObject。PSObject是单个对象,其中数组是对象的集合。+=运算符将新的PSobject添加到列表中。当循环完成时,你将得到一个充满PSObject的数组。这是一个很好的解决方案,但我选择Shay的是因为RAM问题。非常感谢您的解释: