2010-02-05 9 views
6

Estoy tratando de reemplazar una oración en el archivo .config usando powershell.Pasar la cadena incluye signos de dólar para -Restaurar la variable

${c:Web.config} = ${c:Web.config} -replace 

'$BASE_PATH $ \ Test \ bin` $ Test_TYPE` $ \ WebTest.dll', 'c: \ Archivos de programa \ ejemplo \ webtest.dll'

cada vez que intento ejecutar el código anterior consigo

"patrón de expresión regular no válida: $ base_path $ \ Test \ bin \ $ test_type $ \ WebTest.dll" en c: \ pruebas \ runtesting.ps1 -replace < < < < $ base_path $ \ Test \ bin \ $ test_type $ \ WebTest.dll

Si yo no uso el backtick los signos de dólar desaparecerán y algo de texto.

¿Cómo pasaría los signos de dólar en una cadena para "reemplazar"?

+0

Agregué el código a mi respuesta. – stej

Respuesta

5

Esto es sobre cómo escapar de las expresiones regulares. Cada carácter especial (especial con respecto a las expresiones regulares) como $ deben acompañarse \

'$A$B()[].?etc' -replace '\$|\(|\)|\[|\]|\.|\?','x' 
'$BASE_PATH$\Test\bin$Test_TYPE$\WebTest.dll' -replace '\$BASE_PATH\$\\Test\\bin\$Test_TYPE\$\\WebTest.dll','something' 

La tilde se utiliza cuando la expresión regular sería así:

'$A$B' -replace "\`$",'x' 
+0

Cuando probé tu ejemplo, funcionó perfectamente, pero cuando lo probé en mi código como sigue, no tuve suerte. 1) '\ $ base_path \ $ \ Test \ bin \\ $ test_type \ $ \ WebTest.dll', 'c: \ Archivos de programa \ ejemplo \ webtest.dll' 2) "\ '$ base_path \' $ \ Test \ bin \\ '$ Test_TYPE \' $ \ WebTest.dll ", 'c: \ Archivos de programa \ ejemplo \ webtest.dll' –

+0

Antes de enviar mi comentario, la segunda opción tenía las barras invertidas justo después del retroceso ... pero ahora no se muestran. –

+0

Probé lo siguiente y trabajé después de agregar una (barra diagonal + retroceso) antes de un signo de dólar y otra barra invertida antes de una barra invertida existente, abrí y cerré la cadena con comillas dobles ... -replace "\' $ BASE_PATH \ '$ \ \ Test \\ bin \\\ '$ Test_TYPE \' $ \\ WebTest.dll " –

3

Para pasar:

$BASE_PATH$\Test\bin\$Test_TYPE$\WebTest.dll 

Cambiar a:

`"\`$BASE_PATH\`$\\Test\\bin\\\`$Test_TYPE\`$\\WebTest.dll"` 

Lógica:

  • Antes de cada signo del dólar entrar \ `
  • Antes de cada barra invertida entrar en otra barra diagonal inversa \
  • Cerrar cadena con comillas dobles ""
+0

Esto me lleva a votar porque ofrece la explicación más simple y concisa del problema. –

1

sólo para proporcionar una un poco más de fondo a stej's answer, hay dos cosas pasando aquí:

1) Al analizar el comando, powershell es expanding the variables en los argumentos de cadena -replace (por ejemplo, la cadena "shell: $ShellId" expandirá la variable ShellId, produciendo shell: Microsoft.PowerShell). El uso del carácter de escape de retroceso, o la declaración de la cadena con comillas simples, lo impide (tanto "shell: `$ShellId" como 'shell: $ShellId' se convierten en shell: $ShellId).

2) El operador utiliza -replace.NET regular expressions, donde los $, \ y . caracteres especiales son elementos del lenguaje.El uso del carácter de escape de barra invertida permite que los caracteres especiales se traten como valores literales dentro de la expresión regular (por ejemplo, \$ coincidirá con un carácter de dólar, mientras que $ coincidirá con el final de la línea). Como $ es utilizado tanto por powershell como por expresiones regulares, debe escaparse dos veces (usando "\`$" o '\$').

En este caso, otra alternativa sería utilizar el método string.Replace, que llevará a cabo un mayúsculas y minúsculas de reemplazo:

${c:Web.config}.Replace(
    '$BASE_PATH$\Test\bin$Test_TYPE$\WebTest.dll', 
    'c:\program Files\example\webtest.dll' 
) 
1

Para aquellos no familiarizados con la distinción, es importante no confundir el acento grave carácter (`) con el comilla simple carácter (') en estos escapes. Por ejemplo:

[SUCCESS] comillas dobles como recipiente con backslash-backtick como de escape:

PS C:\Temp> 'What is $old?' | ForEach-Object {$_ -replace "\`$old", "(New)"} 
What is (New)? 
PS C:\Temp> 

[FAIL] comillas dobles como recipiente con backslash-apóstrofe como escape:

PS C:\Temp> 'What is $old?' | ForEach-Object {$_ -replace "\'$old", "(New)"} 
What is $old? 
PS C:\Temp> 

[SUCCESS] Comillas simples como contenedor con barra invertida simple como escape:

PS C:\Temp> 'What is $old?' | ForEach-Object {$_ -replace '\$old', "(New)"} 
What is (New)? 
PS C:\Temp> 

[FAIL] Las comillas simples como contenedor con barra invertida-tilde como de escape:

PS C:\Temp> 'What is $old?' | ForEach-Object {$_ -replace '\`$old', "(New)"} 
What is $old? 
PS C:\Temp> 

En general, la opción más sencilla puede ser el uso de comillas simples como el contenedor y una sola barra invertida como la fuga : '\$old'

Cuestiones relacionadas