Powershell Foreach构造可删除多个文件中的文本



作为powershell的新手,我在谷歌上搜索了很长时间,制作了一个可以基于这样的一些变量在单个文件中删除部分文本的片段。文本部分可以位于文件中的任何位置。这个特定的部分需要删除。

<#
#create test file
$file = "c:userspublicTestremove.txt"
Set-Content $file (1..100) -Force
$content = Get-Content $file
#>
$file = Get-Content "c:userspublicTestremove.txt"
$StartText= '50'
$EndText= "75"
$LineNumberStart= $file | Select-string -Pattern $StartText
$Start = $linenumberStart.LineNumber
$LineNumberEnd= $file | Select-string -Pattern $EndText
$End = $linenumberEnd.LineNumber
$keep = $file[0..$Start] + $file[$End..($file.Count - 1)]
$keep | Set-Content "c:userspublictestremove.txt"

现在我想有以上的工作功能,但在特定文件夹中的所有文件。然而,由于"表达式只允许作为管道的第一个元素">我无法使用下面的这段代码:

$ReportPath = Split-Path -Parent $Script:MyInvocation.MyCommand.Path
$StartText= "50"
$EndText= "75"
Get-ChildItem -Path $ReportPath -Filter *.txt | ForEach {  (Get-Content $_.PSPath) | 
$LineNumberStart= $_ | Select-string -Pattern $StartText
$Start = $LineNumberStart.LineNumber
$LineNumberEnd= $_ | Select-string -Pattern $EndText
$End = $LineNumberEnd.LineNumber
$keep = $_[0..$Start] + $_[$End..($_.Count - 1)]
$keep|Set-Content $_.PSPath
}

预期的结果是,文件夹中的所有文件都删除了文本文件的中间部分。

有人能帮忙解决这个foreach构造吗?

我建议您在本用例中使用switch,如果我理解正确,您希望从文件中与$StartText值匹配的行开始跳过,并在与$EndText值匹配后停止跳过。如果是这样的话,下面是一个简单的例子,说明如何使用带有-Regex参数的switch语句来实现这一点:

$StartText = '50'
$EndText = '75'
$skip = $false
switch -Regex (0..100) {
$StartText { $skip = $true; continue }
$EndText { $skip = $false; continue }
{ $skip } { continue }
default { $_ }
}

如果这是你所期望的,那么如果你想对每个文件都一样,代码会是这样的,注意使用-File来读取每个文件的内容:

$StartText = '50'
$EndText = '75'
$skip = $false
Get-ChildItem -Path $ReportPath -Filter *.txt | ForEach-Object {
& {
switch -Regex -File ($_.FullName) {
$StartText { $skip = $true; continue }
$EndText { $skip = $false; continue }
{ $skip } { continue }
default { $_ }
}
} | Set-Content ($_.BaseName + '-New' + $_.Extension)
}

最新更新