2016-05-13 83 views
0

我试图替换文本文件上的一部分。 首先我搜索,如果它出现在文本文件中使用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 

} 

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

回答

2

您可以使用-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") 
+0

多数民众赞成也许是最好的解决方案。 –

1

如果该行是永远存在的,你当然可以用-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)) 
} 

(未经测试,我不这样做的时候,而应该是单独的东西这些行。)

+0

谢谢!我使用了你的第一个脚本,并且添加了“| Set-Content sample.txt”,但是我想理解这个,这个[^“]代表什么?它是一种通配符字符吗? –

+0

编辑几行代码,但它似乎只编辑了最后一条语句 –

+0

'[^“] +'是一个正则表达式,它匹配不是引号的字符串。这是指定两个分隔符之间的所有文本的简单方法,在这种情况下,两个引号之间的所有内容。 – Joey

0

内容看起来像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 
0

我现在的问题是,它仅更新条码格式,如果它不再是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 
} 
+0

如果您添加新答案,我们不会收到通知。对具体的答案使用评论。你的问题发生是因为你在你的if-test中包含了'set-content',所以它向文件写入两次(最后一次只用条形码修改覆盖第一个)。如果你在测试中改变了'$ content = $ content -replace ...'(没有任何'set-content')并且使用'$ content |设置内容'在脚本的末尾,它会工作。或者使用我已经这样做的方法。条形码部分从来不是问题的一部分,所以如果你想使用它,你需要扩展我的答案。 –

相关问题