2012-06-13 23 views
8

Pekala, bu beni deli ediyor çünkü regex Rubular üzerinde çalışıyor, ancak PowerShell beklediğim gibi çalışmıyor.PowerShell regex, çok satırlı dizelerle nasıl çalışır?

  1. Ağ dizininde Get-ChildItem yaptım ve sonra çıkışı bir txt dosyasına yönlendirdim.
  2. ben gibi görünen metin dosyasından dizin bilgisi kaldırmak için gitti şu:

enter image description here

  1. Deneyip bir düzenli ifade yazmak için PowerShell kullanmak Dizin bilgilerini kaldırmak için, bazı problemlerle karşılaşıyorum.

Ben kullandığınızda:

$var = Get-Contnet "file path" 
$var -match "Directory.*" 

PowerShell aradığım metin kapmak AMA yeni bir satırda başlayan metin kapmak değil, alıyorum:

Directory: \\Drive\Unit\Proposals\Names\Location\crazy folder path\even crazier folder path\unbelievable folder path\ 

Yani ... kullandığınızda:

$var -match "Directory.*\n.*" 

ben bir şey olsun ...

Bunu Rublar'da denediğimde iyi çalışıyor, burada neyi özlüyorum? Herhangi bir yardım harika olurdu, teşekkürler!

cevap

19

Filburt cevabı iyi biridir ve düzenli ifadeler burada kullanılabilecek en iyi araç vardır gibi görünmüyor. Ancak, yoldan tekrar kafa karışıklığına neden olabilecek bir soruna çarptınız. Buradaki sorun, Get-Content ile doldurduğunuz değişkenin çok satırlı bir dize olmamasıdır. Eğer $var karşı regex maç çalıştırdığınızda ayrı ayrı dizide (dosyasındaki her satır) her nesneye karşı maçları,

$var = Get-Content "file path" 
$var.GetType() # Shows 'Object[]' 

: Bu dizelerden oluşan bir dizidir. Bir satırın sonunu eşleştiremez çünkü sonraki satır yeni bir nesnedir. Bir karşı tek dize nesne ile uğraşırken anlatmak için

$var = (Get-Content "file path" | Out-String) 
$var.GetType() # Shows 'String' now 

PowerShell içinde bazen zor olabilir: burada

Bir geçici çözüm bu gibi tek bir dizeye aşağı dizeleri bu diziyi düzleştirmek için Dizeler dizisi. Onları konsola verirseniz, aynı görünür. Bu durumlarda, GetType() ve Out-String yararlı araçlar olabilir.

Düzenleme: Powershell 3.0 itibariyle Filesystem sağlayıcı Get-Content için -Raw anahtarı içerir. Bu anahtar, Get-Content numaralı telefonu, dosyaları parçalara ayırmadan bir kerede okumak üzere yönlendirir. Out-String geçici çözümünü kullanmaktan önemli ölçüde daha hızlıdır, çünkü parçaları tekrar bir araya getirmek için parçaları parçalara ayırarak zaman kaybetmez.

+1

Teşekkürler! Filburt'un doğru fikre sahip olduğuna kesinlikle katılıyorum, ama neyi kaçırdığımı anlamak istedim. En çok takdir edilen! – Steve

6

Neden bunları dosyaya aktarmadan önce istediğiniz özellikleri seçmiyorsunuz?

Get-ChildItem | Select-Object Mode, LastWriteTime, Length, Name | Out-File Result.txt 
+0

Eh efendim, bu sadece delilik! Bunu biraz daha düşündükten sonra düşündüm, ama regeximin neden ileride başvurmak gerektiğine inandığım gibi çalışmadığını anlamak istiyorum. – Steve

1

Hatların \n ile bitmemesi mümkündür. Windows'daki standart satır sonlandırma karakterlerinin \r\n olduğuna inanıyorum. Regex'inizi eşleştirmek için yeniden yazmayı deneyin.

+0

Yanıt için teşekkürler. $ Var -match "Directory. * \ R \ n. *" 'I veya \ r \ n herhangi bir combo'yu kullanmak hile yapmadı. – Steve

+0

Teşekkürler !!! Mesajını görene ve çözene kadar beynimi bir saatliğine bozuyordum. – Jonathan