String 使用powershell替换文本文件中的字符

String 使用powershell替换文本文件中的字符,string,powershell,replace,String,Powershell,Replace,我正在尝试替换文本文件中的一个部分。 首先,我搜索了文本文件中是否存在它 $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" #

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

$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

}
$check=Get Content sample.txt |其中对象{$\包含(“”)}
如果($checkIISv)
{
写入主机“IIS的版本已为7”
}
其他的
{
写入主机“将IIS版本更新为7”
#我想在这里放置一个代码,如果值不等于7,它将替换值=“7”
#该值通常不是7
}

请帮助,我不认为这里可以使用替换函数,因为“值”被认为是未知的。

您可以使用正则表达式模式替换
-replace
。但是,这是一个web/app xml配置,因此您应该将其作为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")
#$xml=[xml](获取内容“c:\folder\app.config”)
$xml=[xml]@”
"@
$IISVersion=$xml.SelectSingleNode(//add[@key='IIS\U VERSION'])
如果($IISVersion.Value-等式7)
{
写入主机“IIS的版本已为7”
}
其他的
{
写入主机“将IIS版本更新为7”
$IISVersion.Value=“7”
}
$xml.Save(“c:\folder\app.config”)

您可以使用正则表达式模式来替换值。但是,这是一个web/app xml配置,因此您应该将其作为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")
#$xml=[xml](获取内容“c:\folder\app.config”)
$xml=[xml]@”
"@
$IISVersion=$xml.SelectSingleNode(//add[@key='IIS\U VERSION'])
如果($IISVersion.Value-等式7)
{
写入主机“IIS的版本已为7”
}
其他的
{
写入主机“将IIS版本更新为7”
$IISVersion.Value=“7”
}
$xml.Save(“c:\folder\app.config”)

如果该行始终存在,您当然可以使用
-替换
。它执行regex替换,可在此处使用:

$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" />'
}

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

如果该行始终存在,您当然可以使用
-替换
。它执行regex替换,可在此处使用:

$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,所以您应该考虑使用XPath表达式来选择节点并更改值(参见)。但是,您也可以使用正则表达式来实现这一点(使用正向查找来查找位置)

$txt=Get Content sample.txt

$ReXEX=(?< p>内容看起来像XML,因此您应该考虑使用XPath表达式来选择节点并更改值(参见)。但是,您也可以使用正则表达式(使用正查找查找位置)< /P>来完成此操作。
$txt=Get Content sample.txt

$regex='(?我现在的问题是,它只更新条形码格式,如果低于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
}
#将IIS版本更新为7
$content=Get content$path\Web.config
如果($content-match“”)
{
写入主机“IIS的版本已为7”
} 
其他的
{
写入主机“已将IIS版本更新为7”
$content-替换“”,''设置内容$path\sample.txt
}

我现在的问题是,它只更新条形码格式,如果低于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
}
#将IIS版本更新为7
$content=Get content$path\Web.config
如果($content-match“”)
{
写入主机“IIS的版本已为7”
} 
其他的
{
写入主机“已将IIS版本更新为7”
$content-替换“”,''设置内容$path\sample.txt
}

这可能是最好的解决方案。这可能是最好的解决方案。谢谢!我使用了您的第一个脚本,刚刚添加了“| Set Content sample.txt”。不过,我想了解一下这一点,这[^”]代表?它是某种通配符吗?我正要编辑几行,但似乎它唯一编辑的是最后一条语句
[^]+
是一个正则表达式,它匹配的字符串不是引号。这是一种简单的方法,可以指定两个分隔符之间的所有文本,在本例中,指定两个引号之间的所有文本。为此,无论如何,我已经根据您的建议发布了更新的脚本,但是,当我创建另一个集以更新另一个分隔符时er行唯一更改的是最后一个,请参阅我的帖子。提前谢谢谢谢谢谢!我使用了您的第一个脚本,刚刚添加了“| Set Content sample.txt”。但是我想了解这一点,这是什么[^”]代表?它是某种通配符吗?我正要编辑几行,但似乎它唯一编辑的是最后一条语句
[^]+
是一个正则表达式,它匹配的字符串不是引号。这是一种简单的方法,可以指定两个分隔符之间的所有文本,在本例中,指定两个引号之间的所有文本。为此,无论如何,我已经根据您的建议发布了更新的脚本,但是,当我创建另一个集以更新另一个分隔符时er行唯一更改的是最后一个,请参阅我的帖子。提前谢谢。如果您添加新答案,我们不会收到通知。请对特定答案进行注释。出现问题的原因是您在if测试中包含
设置内容,因此它会写入文件两次(最后一个覆盖了第一个,只修改了条形码)。如果在测试中更改为
$content=$content-replace…
(没有任何
设置内容
)在脚本的结尾使用
$content | set content
,它会起作用。或者使用我已经这样做的方法。条形码部分从来都不是问题的一部分,因此如果您想使用它,您需要扩展我的答案。如果您添加新答案,我们不会收到通知。请对特定答案使用注释。您的问题发生了ned,因为您在if测试中包含了
设置内容
,所以它会写入文件两次(最后一次会覆盖第一次,只修改条形码)。如果您在测试中更改为
$content=$content-replace…
(没有任何
设置内容
),并且