2009-02-09 23 views
20

, bir değişkene aracılığı geçirilen bir dize arayan dosyaların bir dizi üzerinde Seç-String çalıştırıyorum ($ id):PowerShell dize değişkeninde saklanan kaçış dizileri nasıl yok sayılır? Benim PowerShell komut dosyasında

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

Maalesef $ id değişken bazen işler Select-String'in kaçış dizileri olarak yorumlamaya çalıştığı "\ C" veya "\ T" gibi. Bunlar geçerli çıkış dizileri değildir, bu yüzden Select-String bir hata atar. Çıkış dizileri olmaları istenmemektedir (örneğin, "C: \ Test" gibi bir dosya yolunun bir parçası olabilir), bu yüzden PowerShell/Select-String'in onları böyle yorumlamasını nasıl engelleyebilirim? Hiç parasız $ id parantez kullanarak denedim.

+0

Kimin yararsız kullanıcı yorumu silindi :-) – alastairs

cevap

32

kullanın statik escape() yöntem, bu düzenli ifade bu karakterleri yorumlamak motoru anlamıyla yerine olarak meta karakterler talimat:

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

Ayrıca bir astar için komut açabilirsiniz (-path bir koleksiyon alabilir dosyaları):

bunlar olsaydı o zaman güvenle geri "\ t" bunu kaçmak için yönteminde inşa farkında değilim sana geçirilen zaman $ id dizesi zaten TAB gibi bir şey içeriyorsa
Select-String -Path path\to\files\\* -Pattern ([regex]::escape($id)) -Quiet 
+0

Bu kırık, çok teşekkürler! – alastairs

+0

Bir kez daha oy kullanabilseydim, bir liner için başka bir +1 verirdim. :-) – Tomalak

+0

Ne yazık ki tek liner belirli bir durum için çalışmaz - Bir -Filtre ve -Recurse parametresini kestim – alastairs

0

. Komut dosyanızın doğru dizeyi ilk sırada geçtiğinden emin olmanız gerekir. Yani 0x0C74 (\ t) 0x09 (TAB) değil geçmek gerekiyor. Bu yüzden kaçış, arama dizgisi ilk tanımlandığında yapılmalıdır.

Regex.Escape TAB kaçacak

-> \ t değil, aynı zamanda normal ifadeler içinde anlam taşıyan bu karakterlerden herhangi kaçacaksınız:

\, *, +, |, {[(,)? , ^, $,., # ve beyaz boşluk

örn.  . -> \.