2010-02-27 27 views
6

-replace işleci veya Replace() yöntemini kullanırken Powershell tarafından kaç tane değişiklik yapıldığını bilmem gerekiyor. Ya da eğer mümkün değilse, herhangi bir değişiklik yaptıysa. ÖrneğinPowershell, kaç tane değişiklik yaptınız?

, Perl, ikame işlemi yapılabilir değiştirmeleri sayısını verir, çünkü, ve sıfır olmayan bir sıfır boolean bağlamında doğru ise yanlış bir yazabilir:

$greeting = "Hello, Earthlings"; 
if ($greeting ~= s/Earthlings/Martians/) { print "Mars greeting ready." } 

Ancak Powershell ile operatör ve yöntem yeni dizgiyi döndürür. Operatörün, nasıl sorulacağını bilen (örneğin, yakalanan gruplar geçerli kapsamda oluşturduğu yeni bir değişkende saklanır) bazı ek bilgiler sağladığını, ancak nasıl bir sayı alacağımı ya da başarı değeri.

Sadece önceki ve sonraki değerleri karşılaştırabilirdim, ancak bu tamamen verimsiz gibi görünüyor.

cevap

8

Haklısınız, sanırım fazladan bir şeyleri sıkıştıramazsınız. Ancak, eşleşme sayısını Regex.Matches() kullanarak bulabilirsiniz. Örneğin, aynı eşleşen motoru kullanan -replace operatörünü kullanabilirsiniz.


biraz daha derin baktıktan sonra bir eşleme yapıldığında her zaman çağrılan bir MatchEvaluator delegenin alır değiştirin bir aşırı yük var. Yani, bunu bir akümülatör olarak kullanırsak, bir seferde değiştirmelerin sayısını sayabiliriz.

> $count = 0 
> $matchEvaluator = [System.Text.RegularExpressions.MatchEvaluator]{$count ++} 
> [regex]::Replace("Hello, Earthlings","l",$matchEvaluator) 
> $count 
Heo, Earthings 
3 
+0

Büyük bir çözüm! –

+0

Bu benim için PS 3/Windows 8'de çalışmaz. Değiştirme işlemi, ancak $ sayısı 0'dır. Ancak, PS 2 öykünmesinde çalıştığımda çalışır (powershell -version 2 aracılığıyla). – bart

+2

Bunun Windows Management Framework 3 sürüm notlarında belgelenen bir değişiklik nedeniyle olduğunu öğrendim: "Komut dosyaları kendi kapsamlarında çalıştırılan komut dosyaları olarak çalıştırılır". $ Count global yapmak problemi çözüyor. – bart

0

aslında şeyleri değiştirmek ve onları boş değil script Versiyon:

$greeting = "Hello, earthlings. Mars greeting ready" 
$counter = 0 
$search = '\s' 
$replace = '' 
$evaluator = [System.Text.RegularExpressions.MatchEvaluator] { 
    param($found) 
    $counter++ 
    Write-Output ([regex]::Replace($found, [regex] $search, $replace)) 
} 

[regex]::Replace($greeting, [regex] $search, $evaluator); 
$counter 

->

> Hello,earthlings.Marsgreetingready 
> 4 
İlgili konular