Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 通过几个foreach收集信息,然后在脚本末尾导出csv_Powershell_Foreach_Export To Csv - Fatal编程技术网

Powershell 通过几个foreach收集信息,然后在脚本末尾导出csv

Powershell 通过几个foreach收集信息,然后在脚本末尾导出csv,powershell,foreach,export-to-csv,Powershell,Foreach,Export To Csv,我有一个脚本,可以扫描我域中的所有服务器,并输出到两个单独的CSV文件——一个简单文件和一个扩展文件 我一次只在csv上写一行。。这将导致数千个文件打开和关闭。。我一直在四处游荡,我明白我应该首先收集所有信息,然后在脚本末尾一次将它们全部写下来。但是我如何使用函数导出csv呢 有没有一种方法可以对短列表和长列表使用相同的函数 该脚本在每个域/服务器上执行许多任务,但为了便于查看,我将其精简为: $domains = "no","se","dk" # Loop through specified

我有一个脚本,可以扫描我域中的所有服务器,并输出到两个单独的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进行追加,但我使用的是一个函数,让我来实现这一点。

您需要将数据保存在内存中,以防止多个文件打开/关闭

您可以通过将数据添加到如下数组来完成此操作:

$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问题。非常感谢您的解释: