【问题标题】:Replace a char in a text file using powershell使用powershell替换文本文件中的字符
【发布时间】:2016-09-10 06:40:06
【问题描述】:

我正在尝试替换文本文件中的一部分。 首先我搜索它是否存在于文本文件中

$check = Get-Content sample.txt | Where-Object {$_.Contains('<add key="IIS_VERSION" value="7" />')}

if ($checkIISv)
{
Write-Host "IIS's version is already 7"
}
else
{
Write-Host "Update IIS version to 7"

# I want to place here a code that will replace the value="7" if it is not =7
# This value is usually not 7

}

请帮忙,我认为这里不能使用替换功能,因为“值”被认为是未知的。

【问题讨论】:

    标签: string powershell replace


    【解决方案1】:

    您可以使用带有正则表达式模式的-replace 来替换该值。但是,这是一个 web/app xml-config,因此您应该将其修改为 XML 文档。例如。

    #$xml = [xml](Get-Content "c:\folder\app.config")
    $xml = [xml]@"
    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <appSettings>
        <add key="IIS_VERSION" value="8" />
        <add key="somekey" value="somevalue" />
      </appSettings>
    </configuration>
    "@
    
    $IISVersion = $xml.SelectSingleNode("//add[@key='IIS_VERSION']")
    
    if ($IISVersion.Value -eq 7)
    {
        Write-Host "IIS's version is already 7"
    }
    else
    {
        Write-Host "Update IIS version to 7"
        $IISVersion.Value = "7"
    }
    
    $xml.Save("c:\folder\app.config")
    

    【讨论】:

    • 这可能是最好的解决方案。
    【解决方案2】:

    如果线路始终存在,您当然可以使用-replace。它做了一个正则表达式替换,可以在这里使用:

    $content = Get-Content sample.txt
    if ($content -match '<add key="IIS_VERSION" value="7" />') {
      Write-Host "IIS's version is already 7"
    } else {
      Write-Host "Update IIS version to 7"
      $content -replace '<add key="IIS_VERSION" value="[^"]+" />', '<add key="IIS_VERSION" value="7" />'
    }
    

    这是使用字符串替换时最简单的方法。

    但是,您的文件看起来很像 XML。在这种情况下,使用 PowerShell 也提供的 XML 操作实际上应该更容易:

    $content = [xml](Get-Content sample.txt)
    $iisKey = $content.SelectSingleNode("//add[@key = 'IIS_VERSION']")
    if ($iisKey.value -eq 7) {
      Write-Host "IIS's version is already 7"
    } else {
      Write-Host "Update IIS version to 7"
      $iisKey.value = '7'
      $content.Save((Resolve-Path sample.txt))
    }
    

    (未经测试,我不经常这样做,但应该是那些单独的东西。)

    【讨论】:

    • 谢谢!我使用了您的第一个脚本并添加了“| Set-Content sample.txt”但是我想了解一下,这个 [^"] 代表什么?它是某种通配符吗?
    • 我即将编辑几行,但它似乎唯一编辑的是最后一条语句
    • [^"]+ 是一个正则表达式,它匹配不是引号的字符串。这是指定两个分隔符之间的所有文本的一种简单方法,在这种情况下,是两个引号之间的所有内容。
    • 谢谢你,无论如何我已经使用你的建议发布了更新的脚本,但是当我创建另一个集合来更新另一行时,唯一改变的是最后一个,请参阅我的帖子。提前谢谢你
    【解决方案3】:

    内容看起来像 XML,因此您应该考虑使用 xpath 表达式来选择节点并更改值(请参阅answer from Frode F.)。但是,您也可以使用正则表达式来执行此操作(使用正向向后查找来查找位置)

    $txt = Get-Content sample.txt
    $regex = '(?<=<add key="IIS_VERSION" value=")[^"]+'
    $txt -replace $regex, 7
    $txt | Set-Content sample.txt
    

    【讨论】:

      【解决方案4】:

      我现在的问题是它只更新条形码格式,如果低于7就不再更新iis版本

      $path ='C:\Users\hello\Documents'

      #Update the IIS version to 7
      
      $content = Get-Content $path\Web.config
      
      if ($content -match '<add key="IIS_VERSION" value="7" />') 
      {
        Write-Host "IIS's version is already 7"
      } 
      else 
      {
        Write-Host "Updated IIS version to 7"
        $content -replace '<add key="IIS_VERSION" value="[^"]+" />', '<add key="IIS_VERSION" value="7" />' | Set-Content $path\sample.txt
      }
      
      
      # Update the Barcode Format
      
      if ($content -match '<add key="BARCODE_FORMAT" value="1" />')
      {
          Write-Host "Barcode format is already 1"
      }
      else
      {
          Write-Host "Updated Barcode Format to 1"
          $content -replace '<add key="BARCODE_FORMAT" value="[^"]+" />', '<add key="BARCODE_FORMAT" value="1" />' | Set-Content $path\sample.txt
      }
      

      【讨论】:

      • 如果您添加新答案,我们不会收到通知。在具体答案上使用 cmets。您的问题发生是因为您在 if-test 中包含set-content,因此它两次写入文件(最后一次覆盖第一个,只修改了条形码)。如果您在测试中更改为$content = $content -replace ...(没有任何set-content)并在脚本末尾使用$content | set-content,它会起作用。或者使用我已经这样做的方法。条形码部分从来都不是问题的一部分,所以如果你想使用它,你需要扩展我的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-12
      • 1970-01-01
      • 1970-01-01
      • 2020-09-27
      • 2016-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多