2017-08-10 55 views
1

我使用下面的PowerShell脚本删除在.csv文件中引号:我如何写回使用通配符路径读取的同一个文件?

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

该文件将始终被命名为TestQualifier但可能印在文件名末尾的日期和时间(如TestQualifier10082017091010)。通配符在源代码处理这个,但我不知道如何将源文件名写入输出文件名。 Out-File不接受通配符。

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

任何帮助将是伟大的。

回答

1

您需要解析路径,最好将其保存在变量中以便在管道中使用。

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

Resolve-Path自身收益System.Management.Automation.PathInfo对象,所以我们拓展的路径属性来获取这一点。

因此,假设只有一条路径与该过滤器匹配,现在将其作为字符串存储在$path中。

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

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

+0

良好的建议重新命名;一个简单的替代方法'解析路径C:\ TestQualifier * .csv |选择扩展为完整提供者本机路径(即使在.NET方法调用中也可以安全使用)的“扩展属性路径”为:'Convert-Path C:\ TestQualifier * .csv'。 (后者相当于'Resolve-Path C:\ TestQualifier * .csv | Select -ExpandProperty ProviderPath'。) – mklement0

+1

很酷的知道 – Matt

0

如果一个以上的文件以与通配符进行处理:

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 
} 
1

为了提供另一种解决方案,其使用-pv-PipelineVariable)通用参数(PSv4 +):

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

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

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

+1

我一直有麻烦得到好的用例。很高兴看到我玩 – Matt

相关问题