2009-02-09 27 views
20

En mi script de PowerShell, estoy corriendo Select-String durante varios archivos, en busca de una cadena que se pasa en ella a través de una variable ($ id):¿Cómo ignorar las secuencias de escape almacenadas en la variable de cadena PowerShell?

foreach ($file in (ls "path\to\files")) { 
    $found = $false 
    $found = Select-String -Path $file $id -Quiet 
    if ($found) { 
     break 
    } 
} 

Por desgracia, la variable de identificación $ a veces las cosas como "\ C" o "\ T", que Select-String intenta interpretar como secuencias de escape. Estas no son secuencias de escape válidas, por lo que Select-String arroja un error. No están destinados a ser secuencias de escape (por ejemplo, podría ser parte de una ruta de archivo como "C: \ Test"), entonces, ¿cómo puedo evitar que PowerShell/Select-String los interprete como tal? He intentado usar paréntesis alrededor de $ id sin suerte.

+0

Gracias a quien eliminó el comentario inútil :-) – alastairs

Respuesta

32

Uso del escape() método estático, indica al motor de expresiones regulares para interpretar estos personajes, literalmente, en lugar de como metacaracteres:

$id = [regex]::escape($id) 

También puede activar el comando a un chiste (-path puede tomar una colección de archivos):

Select-String -Path path\to\files\\* -Pattern ([regex]::escape($id)) -Quiet 
+0

Esto se rompió, muchas gracias !! – alastairs

+0

Daría otro +1 por el delineador, si pudiera votar dos veces. :-) – Tomalak

+0

Lamentablemente, el one-liner no funciona para la situación específica - Corté un parámetro -Filtro y un -Recurso – alastairs

0

Si la cadena $ id ya contiene algo así como TAB cuando se pasó a continuación, que no estoy al tanto de un sistema incorporado en el método para escapar con seguridad de nuevo a "\ t". Primero debe asegurarse de que su secuencia de comandos pase la cadena correcta. Es decir. necesita pasar 0x5C74 (\ t) no 0x09 (TAB). Entonces, el escape debe hacerse cuando la cadena de búsqueda se define por primera vez.

Regex.Escape escapará TAB -> \ t sino también escapará ninguno de estos personajes que tienen significado dentro de las expresiones regulares:

\, *, +,, |, {[, (,)? , ^, $,., # y espacio en blanco

Por ej.  . -> \.

Cuestiones relacionadas