Cómo utilizar el operador '-replace' en PowerShell para reemplazar cadenas de texto con caracteres especiales y reemplazar con éxito

Tengo un script en el que básicamente estoy haciendo una búsqueda y reemplazo en varias cadenas de texto. El primer par de cadenas funcionan, pero cuando hago las claves de la cuenta, no lo hacen. ¿Cómo puedo solucionar este problema?

Aquí está el 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"))
    }

'-replace' hace una búsqueda regex y usted tiene caracteres especiales en ese último (como el +) Así que podrías usar la versión de reemplazo sin regex de esta manera:

$c = $c.replace('AccountKey=eKkij32jGEIYIEqAR5RjkKgf4OTiMO6SAyF68HsR/Zd/KXoKvSdjlUiiWyVV2+OUFOrVsd7jrzhldJPmfBBpQA==','DdOegAhDmLdsou6Ms6nPtP37bdw6EcXucuT47lf9kfClA6PjGTe3CfN+WVBJNWzqcQpWtZf10tgFhKrnN48lXA==')
Comentarios (0)

Si tiene V3, puede aprovechar la auto-enumeración, el interruptor -Raw en Get-Content, y algo de la nueva sintaxis de contiunación de líneas para simplemente hacerlo, usando el método string .replace() en lugar del operador -replace:

(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 $_
  }

El uso del método .replace() utiliza cadenas literales para el argumento de texto reemplazado (no regex), por lo que no tiene que preocuparse de escapar los metacaracteres regex en el argumento de texto a reemplazar.

Comentarios (0)

En tu ejemplo, has antepuesto a tu cadena de origen AccountKey= pero no a tu cadena de destino.

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

Al no incluirlo en la cadena de destino, la cadena resultante eliminará AccountKey= en lugar de sustituirla. Esto lo haces correctamente con el ejemplo de AccountName=, que parece apoyar esta conclusión ya que no te está dando ningún problema. Si realmente quiere que se le anteponga, entonces esto puede resolver su problema.

Comentarios (0)