我使用以下 PowerShell 脚本删除 .CSV 文件中的引号:
(gc C:\TestQualifier*.csv) | % {$_ -replace '"', ""} | out-file C:\TestQualifier.csv -Fo -En ascii
该文件将始终命名为 TestQualifier,但文件名末尾可能带有日期和时间戳(例如 TestQualifier10082017091010)。通配符在源头处理这个问题,但我不知道如何将源文件名写入输出文件名。 Out-File
不接受通配符。
理想情况下,我还想在输出文件时覆盖现有文件。
任何帮助都会很棒。
最佳答案
提供另一种解决方案,该解决方案使用 -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]
实例并不总是/em> 字符串转换为文件的完整路径 - 请参阅 this GitHub issue .
* $_ -replace '"', ""
被缩短为 $_ -replace '"'
,因为没有指定替换字符串与指定空字符串相同。
请注意第一步中使用 Get-Item
来检索感兴趣的文件,以及 -pv file
如何定义变量 $file
,然后代表 %
(ForEach-Object
) 脚本 block 内的输入文件。
更一般地说,$file
包含 Get-Item
在每个管道处理步骤中输出的 [System.IO.FileInfo]
实例,从而允许后续管道命令中的脚本 block 以引用它。
关于powershell - 如何写回使用通配符路径读取的同一文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45612932/