web-dev-qa-db-fra.com

Comment utiliser l'opérateur '-replace' dans PowerShell pour remplacer des chaînes de texte par des caractères spéciaux et les remplacer avec succès

J'ai un script où je suis fondamentalement en train de chercher et de remplacer sur plusieurs chaînes de texte. Les deux premières chaînes fonctionnent, mais lorsque je crée les clés de compte, elles ne fonctionnent pas. Comment puis-je résoudre ce problème?

Voici le script:

Get-ChildItem "[FILEPATH]" -recurse |
    Foreach-Object {
        $c = ($_ | Get-Content)
        $c = $c -replace 'abt7d9epp4','w2svuzf54f'
        $c = $c -replace 'AccountName=adtestnego','AccountName=zadtestnego'
        $c = $c -replace 'AccountKey=eKkij32jGEIYIEqAR5RjkKgf4OTiMO6SAyF68HsR/Zd/KXoKvSdjlUiiWyVV2+OUFOrVsd7jrzhldJPmfBBpQA==','DdOegAhDmLdsou6Ms6nPtP37bdw6EcXucuT47lf9kfClA6PjGTe3CfN+WVBJNWzqcQpWtZf10tgFhKrnN48lXA=='
        [IO.File]::WriteAllText($_.FullName, ($c -join "`r`n"))
    }
20
user2957157

'-replace' effectue une recherche regex et vous avez des caractères spéciaux dans cette dernière (comme +). Vous pouvez donc utiliser la version de remplacement non regex comme ceci:

$c = $c.replace('AccountKey=eKkij32jGEIYIEqAR5RjkKgf4OTiMO6SAyF68HsR/Zd/KXoKvSdjlUiiWyVV2+OUFOrVsd7jrzhldJPmfBBpQA==','DdOegAhDmLdsou6Ms6nPtP37bdw6EcXucuT47lf9kfClA6PjGTe3CfN+WVBJNWzqcQpWtZf10tgFhKrnN48lXA==')
42
Adil Hindistan

Si vous avez la V3, vous pouvez tirer parti de l'énumération automatique, du commutateur -Raw dans Get-Content et de la nouvelle syntaxe de contiunation de ligne pour y parvenir, en utilisant la méthode string .replace () à la place de la opérateur remplaçant:

(Get-ChildItem "[FILEPATH]" -recurse).FullName |
  Foreach-Object {
   (Get-Content $_ -Raw).
     Replace('abt7d9epp4','w2svuzf54f').
     Replace('AccountName=adtestnego','AccountName=zadtestnego').
     Replace('AccountKey=eKkij32jGEIYIEqAR5RjkKgf4OTiMO6SAyF68HsR/Zd/KXoKvSdjlUiiWyVV2+OUFOrVsd7jrzhldJPmfBBpQA==','AccountKey=DdOegAhDmLdsou6Ms6nPtP37bdw6EcXucuT47lf9kfClA6PjGTe3CfN+WVBJNWzqcQpWtZf10tgFhKrnN48lXA==') |
   Set-Content $_
  }

L'utilisation de la méthode .replace () utilise des chaînes littérales pour l'argument texte remplacé (pas regex). Vous n'avez donc pas à craindre d'échapper aux métacaractères regex dans l'argument text-to-replace.

7
mjolinor

Dans votre exemple, vous avez préfixé votre chaîne source avec AccountKey= mais pas votre chaîne cible.

$c = $c -replace 'AccountKey=eKkij32jGEIYIEqAR5RjkKgf4OTiMO6SAyF68HsR/Zd/KXoKvSdjlUiiWyVV2+OUFOrVsd7jrzhldJPmfBBpQA==','AccountKey=DdOegAhDmLdsou6Ms6nPtP37bdw6EcXucuT47lf9kfClA6PjGTe3CfN+WVBJNWzqcQpWtZf10tgFhKrnN48lXA=='

En n'incluant pas cela dans la chaîne cible, la chaîne résultante supprimera AccountKey= au lieu de le remplacer. Vous faites cela correctement avec le AccountName= _ exemple, qui semble corroborer cette conclusion car elle ne vous pose aucun problème. Si vous voulez vraiment que cela soit ajouté, cela peut résoudre votre problème.

4
Anthony Neace