【问题标题】:PowerShell add string before pattern in a filePowerShell在文件中的模式之前添加字符串
【发布时间】:2020-12-29 18:21:10
【问题描述】:

我正在尝试在.sln 文件中的$pattern 之前添加一行。唯一的问题是,当我尝试在 if 语句中添加 $firstOccurrence 条件时,它根本没有添加任何内容。它仍然会触发 Write-Debug。

现在第一次出现的部分已被注释掉,但我似乎无法找出为什么在我设置第一次出现时它没有写任何东西。

我的解决方案的原始来源可以在这里找到: How to declare a variable and its type is Boolean in PowerShell?

    $firstOccurrence = $true;
    $pattern = "Global"
    (Get-Content $fileName) | Foreach-Object {      
        #if ($firstOccurrence) {
            if ($_ -match $pattern) {
                Write-Debug "test"
                $firstOccurrence = $false
                
                #Add Lines after the selected pattern 
                "aaaaaaaaaaaaaaaaaaaaaaa"
            }
        #}

        # send the current line to output
        $_

    } | Set-Content $fileName

【问题讨论】:

  • 对我来说效果很好。所以文件中有多个“全局”,这就是为什么你担心第一次出现?
  • 是的,当我省略 $firstOccurrence 时,它工作正常并将该行添加到所有找到的行中。但是当我添加条件和$firstOccurrence 时,它不会添加任何东西。
  • 请更准确地输出您想要的输出。标题说 [1] 在第一次出现某些模式之前添加一个 字符串。问题本身说 [2] 在模式之前添加一个 line ,而代码中的注释似乎解释了您想要在模式 after 之后添加一行。我给了你一个处理 [1] 和 [2] 的答案,但到目前为止你只回答 它不起作用Edit你的问题并显示输出应该是什么样子。

标签: powershell


【解决方案1】:

您也可以使用(非常快)switch -Regex 来执行此操作,例如:

$fileName        = 'D:\Test\blah.txt'
$firstOccurrence = $true
$pattern         = "Global"
$insert          = "aaaaaaaaaaaaaaaaaaaaaaa"

$newContent = switch -Regex -File $fileName {
    $pattern { 
        if ($firstOccurrence) { 
            $insert
            $firstOccurrence = $false 
        }
        $_
    }
    default { $_ }
}
$newContent | Set-Content $fileName -Force

或者你的意思是这样的:

$fileName        = 'D:\Test\blah.txt'
$pattern         = "Global"
$insert          = "aaaaaaaaaaaaaaaaaaaaaaa"

((Get-Content -Path $fileName -Raw) -split $pattern, 2) -join "$insert $pattern" | Set-Content $fileName -Force

?

【讨论】:

  • 它没有用。我得到了同样的结果。
  • @5Chameleons 嗯,这让我很惊讶,因为我的测试文件就像一个魅力。仅在Global 的第一次出现上方插入该行。所有其他行都保持原样,即使它们也可以包含单词Global。究竟是什么不工作?
  • 设置内容不会覆盖$fileName。它确实为每个 Global 实例添加了行,但是当我放入 $firstOccurrence = $false 语句时。它只是出于某种原因保留旧文件。
  • @5Chameleons 然后添加开关-Force,这样它就可以覆盖只读文件,并确保您当时没有在某些阻塞应用程序中打开文件。您还可以将其输出到一个 new 文件,该文件总是更安全,因此不会覆盖原始文件。
猜你喜欢
  • 2021-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-19
  • 2013-08-27
  • 2021-11-16
  • 2023-03-07
  • 1970-01-01
相关资源
最近更新 更多