我有一个带有脚本的文本文件,我想将其分成两个
下面是虚拟脚本
--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)
但我不知道如何将分割保存到两个不同的地方。
这可能不是最好的方法,所以我也愿意接受不同的解决方案。
请帮忙,谢谢!
使用基于正则表达式的-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
| 归档时间: |
|
| 查看次数: |
1515 次 |
| 最近记录: |