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

时间:2017-08-10 11:49:12

标签: powershell windows-server-2012-r2

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

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

该文件将始终命名为TestQualifier,但可能在文件名末尾标记了日期和时间(例如TestQualifier10082017091010)。通配符在源处理它,但我无法弄清楚如何将源文件名写入输出文件名。 Out-File不接受通配符。

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

任何帮助都会很棒。

3 个答案:

答案 0 :(得分:1)

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

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

Resolve-Path自己返回System.Management.Automation.PathInfo个对象,所以我们扩展了path属性来获取它。

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

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

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

答案 1 :(得分:1)

提供另一种使用-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)脚本块 更一般地说,[System.IO.FileInfo]在每个管道处理步骤中包含Get-Item ? W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'int com.huawei.lcagent.client.LogCollectManager.getUserType()' on a null object reference ? W/System.err: at com.android.server.util.ReportTools.getUserType(ReportTools.java:86) ? W/System.err: at com.android.server.util.ReportTools.isBetaUser(ReportTools.java:73) ? W/System.err: at com.android.server.util.ReportTools.report(ReportTools.java:58) ? W/System.err: at com.android.server.util.HwUserBehaviourRecord.appExitRecord(HwUserBehaviourRecord.java:65) ? W/System.err: at com.android.server.am.ActivityManagerService$UiHandler.handleMessage(ActivityManagerService.java:1572) ? W/System.err: at android.os.Handler.dispatchMessage(Handler.java:102) ? W/System.err: at android.os.Looper.loop(Looper.java:150) ? W/System.err: at android.os.HandlerThread.run(HandlerThread.java:61) ? W/System.err: at com.android.server.ServiceThread.run(ServiceThread.java:46) E/ReportTools: This is not beta user build ? I/Process: Sending signal. PID: 10115 SIG: 9 ? I/PgedBinderListener: kstate callback type:8 value1=10115 value2=KILLED 实例输出,允许后续管道命令中的脚本块引用它。

答案 2 :(得分: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
}