2009-02-09 9 views
20

Nel mio script PowerShell, sto correndo Select-String più di un certo numero di file, alla ricerca di una stringa passata in esso tramite una variabile ($ id):Come ignorare le sequenze di escape memorizzate nella variabile stringa PowerShell?

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

Purtroppo, la variabile id $ a volte le cose come "\ C" o "\ T", che Select-String tenta di interpretare come sequenze di escape. Queste non sono sequenze di escape valide, quindi Select-String genera un errore. Non sono intese come sequenze di escape (ad es. Potrebbero essere parte di un percorso di file come "C: \ Test"), quindi come posso impedire a PowerShell/Select-String di interpretarle come tali? Ho provato a usare parentesi per $ id senza fortuna.

+0

Grazie a chi ha eliminato il commento inutile :-) – alastairs

risposta

32

Utilizzare il escape() metodo statico, esso indica al motore di espressioni regolari per interpretare questi personaggi letteralmente piuttosto che come metacaratteri:

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

è inoltre possibile attivare il comando per un uno di linea (-path può prendere una raccolta di file):

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

Questo lo ha rotto, grazie mille !! – alastairs

+0

Darei un altro +1 per la copertina, se potessi votare due volte. :-) – Tomalak

+0

Purtroppo la one-liner non funziona per la situazione specifica - ho ritagliato un filtro -Filter e un parametro -Recurse – alastairs

0

Se la stringa $ id contiene già qualcosa di simile TAB quando è passata a te allora io non sono a conoscenza di una costruito nel metodo per mettersi in salvo si torna a "\ t". Devi assicurarti che il tuo script abbia passato la stringa corretta in primo luogo. Cioè ha bisogno di passare 0x5C74 (\ t) non 0x09 (TAB). Quindi l'escaping deve essere fatto quando viene prima definita la stringa di ricerca.

Regex.Escape sfuggirà TAB -> \ t, ma anche sfuggire a qualcuno di questi personaggi che hanno un significato all'interno di espressioni regolari:

\, *, +,, |, {, [, (,)? , ^, $,., # e spazio bianco

ad es.  . -> \.

Problemi correlati