2016-04-25 6 views
0

Ich versuche, eine Schleife für die Übereinstimmung der Zeichenfolgen mit Schlüsseln im Wörterbuch zu schreiben.Stimmen Sie die Zeichenfolgen mit Schlüsseln ab und ersetzen Sie die Werte mit PowerShell

Ich versuche, jede Zeichenfolge in der app.config-Datei mit jedem Schlüssel im Wörterbuch übereinstimmen. Zum Beispiel gibt es eine Zeichenfolge namens "Client", ich muss diese Zeichenfolge mit allen Schlüsseln im Wörterbuch übereinstimmen. Wenn die Zeichenfolge übereinstimmt, ersetzen Sie den Wert "Arizona" durch eine Zeichenfolge in der app.config-Datei, andernfalls überspringen.

Kann mir bitte jemand vorschlagen, die Schleife für den Abgleich und den Austausch schriftlich.

+0

Verwenden [ '[Regex] :: Replace' mit' MatchEvaluator'] (http://stackoverflow.com/a/30666293). – PetSerAl

+0

@PetSerAl Eigentlich versuche ich ein separates Skript nur für den Vergleich der Zeichenfolgen und das Ersetzen der Werte zu schreiben. – mahesh

Antwort

0

Wenn ich Ihre Frage verstehe, dann sehe keinen Grund, Regex.Replace hier zu verwenden. String.Replace ist wahrscheinlich besser, da Sie literale Zeichenfolgenwerte abgleichen möchten.

Das Seltsame an Hashtabellen ist, dass sie schwerer zu nummerieren sind als Arrays, daher sind sie etwas schwieriger für foreach oder ForEach-Object.

versuchen, etwas wie folgt aus:

foreach ($Key in $HashTable.Keys) { 
    $FieldName = '{{' + $Key.ToString() + '}}'; 
    $FieldValue = $HashTable.Item($Key).ToString(); 
    $AppConfig = $AppConfig.Replace($FieldName, $FieldValue); 
} 

Oder Sie verwenden:

foreach ($Hash in $HashTable.GetEnumerator()) { 
    $FieldName = '{{' + $Hash.Key.ToString() + '}}'; 
    $FieldValue = $Hash.Value.ToString(); 
    $AppConfig = $AppConfig.Replace($FieldName, $FieldValue); 
} 

Beide sollten arbeiten. Sie müssen die GetEnumerator()-Methode angeben, da Hashtabellen normalerweise keine Enumerationsobjekte sind.

+0

Warum Regex verwenden? Weil es normalerweise schneller ist, keine Schleife benötigt und Spaß macht. :-) –

+0

@Bacon Bits, Danke für die Lösung. Aber irgendwie ist es nicht in der Lage, die Werte zu ersetzen. – mahesh

0

Die einfache Implementierung für das Skript sieht wie folgt aus. Ich habe es für die Eingaben getestet, die Sie erfolgreich angegeben haben.

[regex]::Replace($appConfigFile, "{{(\w*)}}",{param($match) $dictionaryObject[$($match.Groups[1].Value)]}) 

Unter der Annahme,, $ appConfigFile hat den Inhalt der Datei App.config und $ dictionaryObject hat, wie unten erstellt:

$dictionaryObject = @{} 
$dictionaryObject.Add("client","Arizona") 
$dictionaryObject.Add("type","Test") 

... und so weiter.

Referenz:Regex.Replace Method (String, MatchEvaluator)

Verwandte Themen