使用powershell替换文本文件中的字符
我试图替换文本文件上的一部分。 首先我搜索,如果它出现在文本文件中使用powershell替换文本文件中的字符
$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
}
请帮帮忙,我不认为,因为“价值”被认为是未知的替换功能都可以在这里使用。
您可以使用-replace
和正则表达式来替换该值。但是,这是一个Web /应用程序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")
如果该行是永远存在的,你当然可以用-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。在这种情况下,它实际上应该是更容易使用XML操作,其提供的PowerShell以及:
$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”,但是我想理解这个,这个[^“]代表什么?它是一种通配符字符吗? –
编辑几行代码,但它似乎只编辑了最后一条语句 –
'[^“] +'是一个正则表达式,它匹配不是引号的字符串。这是指定两个分隔符之间的所有文本的简单方法,在这种情况下,两个引号之间的所有内容。 – Joey
内容看起来像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
我现在的问题是,它仅更新条码格式,如果它不再是IIS版本低比7
$ PATH = 'C:\用户\你好\文件'
#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
}
如果您添加新答案,我们不会收到通知。对具体的答案使用评论。你的问题发生是因为你在你的if-test中包含了'set-content',所以它向文件写入两次(最后一次只用条形码修改覆盖第一个)。如果你在测试中改变了'$ content = $ content -replace ...'(没有任何'set-content')并且使用'$ content |设置内容'在脚本的末尾,它会工作。或者使用我已经这样做的方法。条形码部分从来不是问题的一部分,所以如果你想使用它,你需要扩展我的答案。 –
多数民众赞成也许是最好的解决方案。 –