2012-06-13 18 views
8

好吧,這讓我很瘋狂,因爲我的正則表達式正在處理Rubular,但是PowerShell並沒有像我期望的那樣工作。PowerShell正則表達式如何與多行字符串一起使用?

  1. 我在網絡目錄上做了一個Get-ChildItem,然後將輸出導向到一個txt文件中。
  2. 我去從出現類似的文本文件中刪除的目錄信息如下:

enter image description here

  • 當我使用PowerShell嘗試寫一個正則表達式要刪除號碼簿信息,我遇到了一些問題。
  • 當我使用:

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

    PowerShell的抓住我要找的內容,但是它不會搶在新行開始的文本,我得到:

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

    所以......當我使用:

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

    我什麼也沒得到...

    當我在Rublar上試試它時,它工作正常,我在這裏錯過了什麼?任何幫助將是偉大的,謝謝!

    回答

    19

    Filburt的回答是一個很好的,它看起來並不像正則表達式在這裏使用的最佳工具。然而,你遇到了一個可能導致混亂的問題。這裏的問題是你用Get-Content填充的變量不是多行字符串。它是一個字符串數組:

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

    當針對$var運行一個正則表達式的匹配,它靠在陣列(在該文件中的每一行)單獨地在每個對象相匹配。由於下一行是新對象,因此它不能匹配一行的末尾。這裏

    一種解決方法是向下拉平的字符串數組到一個字符串是這樣的:

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

    在PowerShell中它有時會非常棘手告訴當你處理一個String對象對的字符串數組。如果您將它們輸出到控制檯,它們看起來完全相同在這些情況下,GetType()Out-String可能是有用的工具。

    編輯:作爲Powershell的3.0的,所述Filesystem提供商包括-Raw開關Get-Content。該開關指示Get-Content一次全部讀取文件而不將其拆分成塊。這比使用Out-String解決方法快得多,因爲它不會浪費時間將作品拆開,而只是將它們重新放在一起。

    +1

    謝謝!我當然同意菲爾布特有正確的想法,但我想明白我錯過了什麼。非常感謝! – Steve

    6

    爲什麼不在管道輸出到文件之前選擇所需的屬性?

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

    好吧,先生,這只是瘋了!實際上,我想到了這一點後,想了一會兒,但我想了解爲什麼我的正則表達式不起作用,因爲我認爲它應該爲將來的參考。 – Steve

    1

    行有可能不以\n結束。我相信Windows中的標準行終止字符是\r\n。嘗試重新編寫你的正則表達式來匹配它。

    +0

    感謝您的迴應。使用$ var -match「目錄。* \ r \ n。*」或者\ r \ n的任何組合都沒有成功。 – Steve

    +0

    謝謝!在我看到你的帖子並解決它之前,花了我的腦筋花了一個小時。 – Jonathan

    相關問題