如何在PowerShell中将一个文本文件分成两个?

Sha*_*zmi 5 powershell

我有一个带有脚本的文本文件,我想将其分成两个

下面是虚拟脚本

--serverone

this is first part of my script


--servertwo


this is second part of my script
Run Code Online (Sandbox Code Playgroud)

我想创建两个文本文件,如下所示

文件1

--serverone

this is first part of my script
Run Code Online (Sandbox Code Playgroud)

文件2

--servertwo


this is second part of my script
Run Code Online (Sandbox Code Playgroud)

到目前为止,我在脚本中添加了一个我知道不存在的特殊字符(“}”)

$script = get-content -Path "C:\Users\shamvil\Desktop\test.txt"
$newscript = $script.Replace("--servertwo","}--servertwo")
$newscript.split("}")
Run Code Online (Sandbox Code Playgroud)

但我不知道如何将分割保存到两个不同的地方。

这可能不是最好的方法,所以我也愿意接受不同的解决方案。

请帮忙,谢谢!

mkl*_*nt0 7

使用基于正则表达式的-split操作:

$i = 0
(Get-Content -Raw test.txt) -split '(?m)^(?=--)' -ne '' |
  ForEach-Object { $fileName = 'file' + (++$i); Set-Content $fileName $_ }
Run Code Online (Sandbox Code Playgroud)
  • 这假设以开头的行开头的每个行块--都将保存到单独的文件中。

  • Get-Content -Raw将整个文件读入单个多行字符串。

  • 至于传递给的分隔符正则表达式-split

    • 内联正则表达式选项在每行(?m)上进行锚定^$匹配
    • ^(?=--)因此匹配以 开头的每一行--,使用定义的非捕获先行断言 ( (?=...)) 来确保 不会--从结果块中删除(默认情况下,不包括与分隔符正则表达式匹配的内容)。
  • -ne ''过滤掉由字符串开头匹配的分隔符表达式产生的额外空元素。

  • 请注意,Set-Content对输入文件的字符编码一无所知,并使用其默认编码;-Encoding根据需要使用。


zett42指出,可以借助延迟绑定脚本块参数来简化文件写入部分:

$i = 0
(Get-Content -Raw test.txt) -split '(?m)^(?=--)' -ne '' |
  Set-Content -LiteralPath { (Get-Variable i -Scope 1).Value++; "file$i" }
Run Code Online (Sandbox Code Playgroud)
  • 调用Get-Variable访问和递增$i作用域中的变量是必要的,因为延迟绑定脚本块(以及计算属性的脚本块)在子作用域中运行 - 也许令人惊讶,如GitHub 问题 #7157中所述

    • 一个更短但更晦涩的选项是使用([ref] $i).Value++;有关详细信息,请参阅此答案
  • zett42 还指出了一项拟议的未来增强功能,通过引入反映当前管道对象的序列号的自动变量,可以消除手动维护序列号的需要:请参阅GitHub 问题 #13772 $PSIndex