代码之家  ›  专栏  ›  技术社区  ›  soziblewuup

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

  •  2
  • soziblewuup  · 技术社区  · 7 年前

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

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

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

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

    任何帮助都会很好。

    3 回复  |  直到 7 年前
        1
  •  2
  •   mklement0    7 年前

    提供另一个解决方案,该解决方案使用 -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 '"'

    Get-Item 在第一步中,为了检索感兴趣的文件,以及如何 -pv file 定义变量 $file ,然后表示 % ( ForEach-Object
    一般来说, $文件 包含 实例输出依据 获取项目

        2
  •  1
  •   mklement0    7 年前

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

    $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
    

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

        3
  •  0
  •   user6811411 user6811411    7 年前

    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
    }