2012-06-13 9 views
8

Dobrze, to doprowadza mnie do szału, ponieważ moje regex działa na Rubular, ale PowerShell nie działa tak, jak oczekuję.Jak działa wyrażenie regularne PowerShell z ciągami wieloliniowymi?

  1. Zrobiłem Get-ChildItem w katalogu sieciowym, a następnie skierowałem wyjście do pliku txt.
  2. poszedłem aby usunąć informacje o katalogu z pliku tekstowego, który pojawia się jak następuje:

enter image description here

  1. Kiedy używać PowerShell aby spróbować i napisać regex aby usunąć informacje z katalogu, napotykam na pewne problemy.

Gdy używam:

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

PowerShell chwyta tekst szukam, ale nie chwycić tekst, który zaczyna się na nowej linii, otrzymuję:

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

Więc ... kiedy używam:

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

mam nic ...

Kiedy próbuję tego na Rublar, działa dobrze, czego tu brakuje? Jakakolwiek pomoc będzie wspaniała, dzięki!

Odpowiedz

19

odpowiedź Filburt jest dobry, a nie wyglądać jak wyrażenia regularne są najlepszym narzędziem do wykorzystania tutaj. Jednak natrafiłeś na problem, który może ponownie wywołać zamieszanie. Problem polega na tym, że zmienna zapełniona przez Get-Content nie jest łańcuchem wieloliniowym. Jest to tablica łańcuchów:

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

Po uruchomieniu mecz regex przed $var, pasuje na każdego obiektu w tablicy (każda linia w pliku), indywidualnie. Nie może się dopasować poza końcem linii, ponieważ następny wiersz jest nowym obiektem.

Jeden obejście jest tu spłaszczyć tę tablicę ciągów w dół w jeden ciąg znaków takich jak to:

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

PowerShell może być czasem trudne powiedzieć, kiedy masz do czynienia z jednym obiekcie String kontra tablica łańcuchów. Jeśli wypiszesz je na konsoli, wyglądają identycznie. W takich przypadkach przydatne mogą być GetType() i Out-String.

Edit: Od PowerShell 3.0, dostawca Filesystem zawiera -Raw przełącznik Get-Content. Ten przełącznik nakazuje Get-Content odczytywanie całego pliku bez dzielenia go na porcje. Jest znacznie szybszy niż użycie obejścia zastępczego Out-String, ponieważ nie marnuje czasu na rozrywanie elementów tylko po to, aby je ponownie połączyć.

+1

Dziękujemy! Z pewnością zgadzam się, że Filburt miał właściwy pomysł, ale chciałem zrozumieć, czego mi brakowało. Najbardziej doceniane! – Steve

6

Dlaczego nie wybrać pożądanych właściwości przed wyprowadzeniem ich do pliku?

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

Cóż, to jest po prostu szalone! Pomyślałem o tym po tym, jak myślałem o tym trochę więcej, ale chciałbym zrozumieć, dlaczego mój regex nie działa tak jak myślę, że powinien na przyszłość. – Steve

1

Możliwe, że linie nie kończą się na \n. Uważam, że standardowe znaki końca linii w systemie Windows to \r\n. Spróbuj ponownie napisać wyrażenie regularne, aby pasowało do tego.

+0

Dzięki za odpowiedź. Używanie $ var -match "Directory. * \ R \ n. *" Lub jakiejkolwiek kombinacji \ r \ n nie działało. – Steve

+0

Dzięki! Siedziałam sobie na głowie przez godzinę, dopóki nie zobaczyłam twojego postu i nie rozwiązałam go. – Jonathan