【问题标题】:Export-CSV with the path as a variable以路径为变量的 Export-CSV
【发布时间】:2012-06-01 05:57:54
【问题描述】:

我有一个脚本,它基本上写下远程共享上的每个文件和文件夹并将其转储到 csv。除了最后一部分,一切都运行得很好(脚本本身还有很多工作要做)。

Import-Csv -Path ($savelocation + '\' + $filename) -Delimiter ',' | ForEach-Object {
    if ($audioarray -contains $_.Extension) {
        $_.MediaType = 'Audio'
        $_
    } elseif ($videoarray -contains $_.Extension) {
        $_.MediaType = 'Video'
        $_
    } elseif ($otherarray -contains $_.Extension) {
        $_.MediaType = 'Other'
        $_
    } else {
        $_
    }
} | Export-Csv -Path ($savelocation + '\' + $filename) -Force -Delimiter ',' -NoTypeInformation

如果我将路径更改为\\servername\share\testfolder 之类的静态位置,它可以正常工作。但是,如果我使用上述方法,或者即使我将($savelocation + '\' + $filename) 加入到$filename 之类的东西中,它仍然只是写入一个空文件。

【问题讨论】:

  • 做Write-Host ($savelocation + '\' + $filename) ...你得到了什么?
  • C:\Temp\NFDW1004-C$Progra~1-2012-5-25.csv - 在最初编写文件之前,我也使用完全相同的命名约定两次,然后添加额外的csv 标头 MediaType.

标签: variables powershell export-to-csv


【解决方案1】:

抱歉,它不适用于任何路径。原因很简单——你读/写同一个文件。如果您读入变量并处理内存中的数据,它会工作。

IMO 具有存储在变量中的路径(元素)与它无关。顺便说一句:您可以使用 Join-Path cmdlet 连接路径... :)

【讨论】:

  • 当然,最简单的答案让我眼前一亮。这确实是文件是同一个文件的事实。我将转储到一个临时文件并删除并重命名它。
  • 如果您想将数据写回同一个文件而不写入临时文件并随后替换原始文件,您可以通过将读取语句放在括号中来实现 ((Import-Csv $csv) | ForEach-Object {...} | Export-Csv $csv -NoType)。请注意,这会将整个文件读入内存,因此不适合处理大文件。
【解决方案2】:

如果你把路径放在一个可验证的地方,它会起作用

$path = $savelocation + '\' + $filename
Export-Csv -Path $path -Force -Delimiter ',' -NoTypeInformation

【讨论】:

  • 不,不会。问题是,当您在管道中读取和写入同一个文件时,写入语句将在读取语句有机会读取文件之前开始写入文件,从而有效地截断文件。将文件名放入变量中不会改变任何内容。
猜你喜欢
  • 1970-01-01
  • 2018-06-27
  • 2020-08-01
  • 2017-06-02
  • 1970-01-01
  • 2016-08-13
  • 1970-01-01
  • 1970-01-01
  • 2014-12-13
相关资源
最近更新 更多