2016-05-13 10 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/app xml-configなので、XML文書として変更する必要があります。 Ex。

#$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

thatsの最適なソリューション:7

$パス= '\ Users \ユーザーこんにちは\ドキュメントC' より。 –

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に非常によく似ています。

+0

ありがとうございます!私はあなたの第1のスクリプトを使用し、 "| Set-Content sample.txt"を追加しましたが、これを理解したいのですが、これはどういう意味ですか?ワイルドカード文字なのですか? –

+0

いくつかの行を編集するが、編集する唯一の文は最後の文であるようだ。 –

+0

'[^"] + 'は文字列にマッチする正規表現で、引用符ではない。これは、2つの区切り文字の間のすべてのテキストを指定する簡単な方法です。この場合は、2つの引用符の間のすべてを区切ります。 – Joey

0
(未テスト、と私はしばしばそれをしない、それだけで何かこれらの行でなければなりません。)

$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)) 
} 

:実際にPowerShellが同様に提供していますXML操作を、使用する方が簡単である必要があり、その場合には

コンテンツは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のバージョンを更新しないことがありますおそらく

#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'を含めることで起こりました。そのため、ファイルに2回書き込まれます(そして、最後のバーコードはバーコードのみが上書きされます)。テストの中で( 'set-content'なしで)' $ content = $ content -replace ... 'に変更し、' $ content |スクリプトの最後に「set-content」と書かれていればうまくいくはずです。または、すでにこれを行っている私のアプローチを使用してください。バーコード部分は質問の一部ではありませんでしたので、使用したい場合は、私の答えを拡大する必要があります。 –

関連する問題