PS 脚本正在导出一个空的 CSV

use*_*224 2 csv powershell select-object export-csv

我有很多时间试图理解为什么这个脚本没有按预期工作。这是一个简单的脚本,我试图在其中导入 CSV,选择我想要的几列,然后导出 CSV 并复制自身。(基本上我们已经归档了数据,由于内存大小限制,我只需要从另一个项目中提取几列数据)。这个脚本非常简单,它显然与它不起作用时造成的挫败感成反比关系......现在最终结果是我最终得到一个空的 csv 而不是一个只包含我选择的列的 csv与选择对象。

$RootPath = "D:\SomeFolder"

$csvFilePaths = Get-ChildItem $RootPath -Recurse -Include *.csv | 
    ForEach-Object{
        Import-CSV $_ |
        Select-Object Test_Name, Test_DataName, Device_Model, Device_FW, Data_Avg_ms, Data_StdDev | 
        Export-Csv $_.FullName -NoType -Force
}
Run Code Online (Sandbox Code Playgroud)

mkl*_*nt0 5

除非您预先完整地将输入文件读入内存否则您无法安全地读取和写入给定管道中的同一个文件。

具体而言,一个命令,例如Import-Csv file.csv | ... | Export-Csv file.csv擦除的内容file.csv

最简单的解决方案是将读取输入文件的命令包含在 中(...),但请注意:

  • 文件的内容(转换成对象)必须装入内存作为一个整体

  • 如果管道在所有(转换后的)对象写回文件之前中断,则存在轻微的数据丢失风险

应用于您的命令:

$RootPath = "D:\SomeFolder"

Get-ChildItem $RootPath -Recurse -Include *.csv -OutVariable csvFiles | 
    ForEach-Object{
        (Import-CSV $_.FullName) | # NOTE THE (...)
          Select-Object Test_Name, Test_DataName, Device_Model, Device_FW, 
                        Data_Avg_ms, Data_StdDev | 
            Export-Csv $_.FullName -NoType -Force
}
Run Code Online (Sandbox Code Playgroud)

请注意,我已经使用-OutVariable csvFiles它来收集输出变量中的 CSV 文件信息对象$csvFiles。您尝试通过收集文件路径$csvFilePaths = ...不起作用,因为它尝试收集Export-Csv输出,但不Export-Csv产生任何输出。

此外,为了安全起见,我已将Import-Csv参数从$_to更改$_.FullName为确保Import-Csv找到输入文件(因为,遗憾的是, file-info 对象$_绑定为string有时会扩展为单纯的 file name)。


一个更安全的解决方案将是输出到一个临时文件中的第一,和(只)在成功完成替换原文件。

无论采用哪种方法,替换文件都将具有默认文件属性和权限;如果原始文件具有要保留的特殊属性和/或权限,则必须明确地重新创建它们。