Powershell从ForEach循环导出到CSV

Powershell从ForEach循环导出到CSV,powershell,csv,export-csv,Powershell,Csv,Export Csv,我是新来Powershell的,但我已经尽力了。 我试图创建一个脚本,将文件复制到阵列中所有XP机器的所有用户桌面。脚本基本上说“如果机器可以ping,请复制文件,如果不能,请不要复制。”然后我想将此信息导出到CSV文件中以供进一步分析 我已经设置好了,但无论我做什么,它都只会导出它运行的最后一台电脑。它似乎运行在所有PC上(通过输出到txt文件进行测试),但不会将所有机器记录到CSV。有人能给点建议吗 $ArrComputers=“PC1”、“PC2”、“PC3” foreach($Compu

我是新来Powershell的,但我已经尽力了。 我试图创建一个脚本,将文件复制到阵列中所有XP机器的所有用户桌面。脚本基本上说“如果机器可以ping,请复制文件,如果不能,请不要复制。”然后我想将此信息导出到CSV文件中以供进一步分析

我已经设置好了,但无论我做什么,它都只会导出它运行的最后一台电脑。它似乎运行在所有PC上(通过输出到txt文件进行测试),但不会将所有机器记录到CSV。有人能给点建议吗

$ArrComputers=“PC1”、“PC2”、“PC3”
foreach($Computers中的计算机){
$Reachable=测试连接-Cn$计算机-缓冲区大小16-计数1-ea 0-安静
$Output=@()
#这台机器够得着吗?
如果($Reachable)
{
#如果是,请复制文件
复制项目-路径“\\servername\filelocation”-目标“\\$Computer\c$\Documents and Settings\All Users\Desktop\filename”
$details=“已复制”
} 
其他的
{
#如果没有,请不要复制该文件
$details=“未复制”
}   
#将此运行中的信息存储到阵列中
$Output=新对象-类型名称PSObject-属性@{
SystemName=$Computer
可达=$Reachable
结果=$details
}|选择对象系统名称、可访问、结果
}
#将阵列输出到CSV文件
$Output |导出Csv C:\GPoutput.Csv
“写入输出”脚本已完成。请检查输出文件
问题在于:

#Store the information from this run into the array  
  $Output =New-Object -TypeName PSObject -Property @{
    SystemName = $Computer
    Reachable = $reachable 
    Result = $details
  } | Select-Object SystemName,Reachable,Result
}  
#Output the array to the CSV File
$Output | Export-Csv C:\GPoutput.csv
foreach循环的每次迭代都保存到
$Output
。覆盖以前存在的内容,即上一次迭代。这意味着只有最后一次迭代保存到
$Output
并导出。因为您正在运行PowerShell v2,所以我建议将整个foreach循环保存到一个变量中并导出该变量

$Output = foreach ($Computer in $ArrComputers) {
  New-Object -TypeName PSObject -Property @{
    SystemName = $Computer
    Reachable = $reachable 
    Result = $details
  } | Select-Object SystemName,Reachable,Result
}
$Output | Export-Csv C:\GPoutput.csv

给你。这将使用
PSCustomObject
,它比
新对象
更快地枚举数据。还将在每个循环后附加到
.csv
文件,因此不会覆盖以前的数据

foreach ($Computer in $ArrComputers) {

$Reachable = Test-Connection -Cn $Computer -BufferSize 16 -Count 1 -ea 0 -quiet

#Is the machine reachable?
if($Reachable)
{
#If Yes, copy file
Copy-Item -Path "\\servername\filelocation" -Destination "\\$Computer\c$\Documents and Settings\All Users\Desktop\filename" 
$details = "Copied"  
} 
else
{
#If not, don't copy the file
$details = "Not Copied"
} 
#Store the information from this run into the array  
       [PSCustomObject]@{
       SystemName = $Computer
       Reachable = $reachable 
       Result = $details
       } | Export-Csv C:\yourcsv.csv -notype -Append 
}  

您可能希望附加导出csv以将项目添加到csv文件中 这里有一个例子

foreach ($item in $ITGlueTest.data)
{
$item.attributes | export-csv C:\organization.csv -Append
} 

我尝试将$Output | Export CSV C:\GPoutput.CSV移动到数组中,但它在每次传递时都会覆盖自身,因为不允许使用-append。我还尝试将整个foreach循环保存到一个变量中,但这会返回错误:“表达式或语句中的意外标记in”。您必须使用v2。我建议将整个foreach循环存储到$Output中,然后将其导出。这不起作用,因为他使用的是v2。PSCustomObject和
-Append
是v3+。错过了他提到的XP机器的部分。