4

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

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

$ArrComputers = "PC1", "PC2", "PC3"

foreach ($Computer in $ArrComputers) {
    $Reachable = Test-Connection -Cn $Computer -BufferSize 16 -Count 1 -ea 0 -quiet
    $Output = @()

    #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  
    $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

Write-output "Script has finished. Please check output files."   
4

3 回答 3

6

问题是这样的:

#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
于 2015-12-08T15:19:36.300 回答
1

您可能希望附加 export-csv 以将项目添加到 csv 文件这是一个示例

foreach ($item in $ITGlueTest.data)
{
$item.attributes | export-csv C:\organization.csv -Append
} 
于 2018-02-15T12:57:57.800 回答
-1

干得好。这使用PSCustomObject枚举数据的速度比New-Object. 每次循环后也会附加到.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 
}  
于 2015-12-08T15:41:22.290 回答