为什么不是重复的原因
既然有3个人已投票结束,那么我想我应该解释一下为什么这个问题不是重复的:
因此,总而言之,我正在寻找一种使用复制(因此出现问题标题)且不使用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/