为什么不是重复的原因

既然有3个人已投票结束,那么我想我应该解释一下为什么这个问题不是重复的:

  • 我不能使用cat或>>,因为它们会混淆文件的编码,这些文件的输入为UTF8,而输出的则为UTF8-BOM。
  • 链接的问题没有显示如何遍历目录中与给定模式匹配的所有文件,以及如何将单个文件连接到输出中的每个匹配文件,以及为新文件提供不同的扩展名。
  • 使用Set-Content并不是针对Powershell 6的 future 版本,因为Set-Content不会添加BOM表标记。在Powershell 5和更低版本中,根据执行用户的配置设置,有时会添加BOM表标记,有时不会添加BOM表标记。请参阅this article末尾的“有关编码的快速注释”。

  • 因此,总而言之,我正在寻找一种使用复制(因此出现问题标题)且不使用Cat或Set-Content的解决方案。

    我需要遍历给定目录中的某些文件,并对每个文件运行以下命令:
    copy /b BOMMarker.txt+InputFile.dat OutputFile.txt
    

    这会将BOMMarker.txt文件的内容插入InputFile.dat的开头,并将输出写入OutputFile.txt
    我找到了this question,它解释了如何循环浏览文件夹以将每个文件加载到Powershell中,但是如何应用“copy / b”命令以便可以在每个文件的开头获取BOM标记?

    编辑

    Jeroen的注释表明我可以对输出文件执行Set-Content,因为Powershell会在开始时自动添加BOM。

    但是我还需要更改扩展名。因此,输出文件名必须与输入文件名相同,只是扩展名(从.dat更改为.txt)并包括BOM。

    我猜我可以以某种方式使用Path.ChangeExtension来执行此操作,但不确定如何将其与添加BOM结合使用。

    编辑-赏金

    我发布的示例答案并非在我测试过的所有环境中都适用,并且我不知道为什么(可能是不同的默认Powershell设置),而且,由于Powershell 6会not output BOM by default,因此也不是 future 的证明。

    从给定目录中,我需要处理与过滤器(DIL_BG_TXN * .dat)匹配的所有文件。

    对于每个文件,我都需要在开始时使用BOM表进行复制,但是生成的新文件必须具有相同的名称,但扩展名为.txt而不是.dat。

    最佳答案

    该解决方案使用的流可以按原样可靠地进行读写:

    $bomStream = [IO.File]::OpenRead('BOMMarker.txt')
    $location = "" # set this to the folder location
    
    $items = Get-ChildItem -Path $location -Filter DIL_BG_TXN*.dat
    
    foreach ($item in $items) {
        $sourceStream = [IO.File]::OpenRead($item.FullName)
        $targetStream = [IO.File]::OpenWrite([IO.Path]::ChangeExtension($item.FullName, '.txt'))
        $bomStream.CopyTo($targetStream)
        $sourceStream.CopyTo($targetStream)
        $targetStream.Flush()
        $targetStream.Close()
        $sourceStream.Close()
        $bomStream.Position = 0
    }
    $bomStream.Close()
    

    当然,请根据其位置写BOMMarker.txt(第一行)的绝对路径。

    关于powershell - 如何在Powershell脚本中执行复制/b来插入BOM表标记,但作为批处理来匹配过滤器并更改输出的ext?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48168063/

    10-13 09:36