如何写回使用通配符路径读取的同一个文件?

How can I write back to same file I read from using a wildcard path?

我正在使用以下 PowerShell 脚本删除 .CSV 文件中的引号:

(gc C:\TestQualifier*.csv) | % {$_ -replace '"', ""} | out-file C:\TestQualifier.csv -Fo -En ascii

文件将始终命名为 TestQualifier,但文件名末尾可能带有日期和时间戳(例如 TestQualifier10082017091010)。通配符在源头处理这个问题,但我不知道如何将源文件名写入输出文件名。 Out-File 不接受通配符。

理想情况下,我还想在输出文件时覆盖现有文件。

任何帮助都会很棒。

您需要解析路径,理想情况下,将其保存在变量中以便在管道中使用它。

$path = Resolve-Path C:\TestQualifier*.csv | Select -Expand Path

Resolve-Path 独立于 returns System.Management.Automation.PathInfo 个对象,所以我们扩展路径 属性 来得到它。

因此假设只有一个路径匹配该过滤器,它现在作为字符串存储在 $path.

(Get-Content $path) | ForEach-Object{$_ -replace '"', ""} | Out-File $path -Force -Encoding ascii

如果这是一次性代码,没关系,但如果您打算以后使用它,避免使用别名并使用完整的参数名称可能更容易。
使用完整的命令和参数名称使代码现在和以后都更易于阅读。

如果必须使用通配符处理多个文件:

ForEach ($File in (gci C:\TestQualifier*.csv)){(gc $File)|%{$_ -replace '"'}|out-file $File -Fo -En ascii}

详细

ForEach ($File in (Get-ChildItem C:\TestQualifier*.csv)){
    (Get-Content $File) | ForEach-Object {
        $_ -replace '"'
    } | Out-File $File -Force -Encoding ascii
}

提供另一种解决方案,它使用 -pv (-PipelineVariable) 公共参数 (PSv4+):

Get-Item C:\TestQualifier*.csv -pv file | % {
  (Get-Content $file.FullName) | % { $_ -replace '"' } |
    Out-File $file.FullName -Force -Encoding Ascii
}

* 如问题所述,Get-Content 调用包含在 (...) 中以确保整个输入文件被读取 预先 ,这样可以将结果写回输入文件。
* .FullName 在这种情况下不是严格需要的,但使用它更安全,因为 [System.IO.FileInfo] 实例不会 总是 字符串转换为文件的 完整 路径 - 参见 this GitHub issue.
* $_ -replace '"', "" 缩短为 $_ -replace '"',因为 not 指定替换字符串与指定空字符串相同。

请注意在第一步中使用 Get-Item 以检索感兴趣的文件,以及 -pv file 如何定义变量 $file,然后代表手头的输入文件在 % (ForEach-Object) 脚本块内。
更一般地说,$file 包含每个管道处理步骤中 Get-Item 输出的 [System.IO.FileInfo] 实例,允许后续管道命令中的脚本块引用它。