2016-12-19 15 views
1

ホストファイルをPowerShellスクリプトから解析します。hostsファイルの正規表現が異なる動作をします

私は別の行動を観察する:

  1. セットアップ:-matchを使用して

    $hostsFile = "$env:windir\System32\drivers\etc\hosts" 
    $hostsRegex = '^\s*(?<Address>[0-9\.\:]+)\s+(?<Host>[\w\.\-]+)\s*$' 
    
    $entries = Get-Content $hostsFile -Encoding Ascii 
    
  2. $entries -match $hostsRegex 
    

    それはすべて私のエントリ(および唯一の私の期待通りに動作し、出力エントリ)。何も私の目標は、カスタムPSを取得することです

...またMultilineSingleLine、などのようなオプションを使用してみました(返されません

[Regex]::Matches($entries, $hostsRegex) 

:.NET Regex.Matchesメソッドを使用して

  • 実際に私はこれを動作させたい:

    function Get-HostsEntries{ 
        $hostsFile = "$env:windir\System32\drivers\etc\hosts" 
        $hostsRegex = '^\s*(?<Address>[0-9\.\:]+)\s+(?<Host>[\w\.\-]+)\s*$' 
    
        $entries = Get-Content $hostsFile -Encoding Ascii 
    
        [Regex]::Matches($entries, $hostsRegex) | %{ 
         New-Object PSObject -Property @{ 
          Address = $_.Groups["Address"].Value 
          Host = $_.Groups["Host"].Value 
         } 
        } 
    } 
    
    Get-HostsEntries 
    

    しかし何も返されません。

    だから私の質問は以下のとおりです。

    1. なぜPowerShellとネット通話が同じように動作していないのですか?
    2. スクリプトを正常に動作させるにはどうすればいいですか?
  • +1

    '$ entries'は文字列の集合です。' Regex.Matches() 'は最初の引数として単一の文字列を取ります –

    答えて

    4

    -Rawを使用してファイルを1つの文字列に読み込みます。さもなければGet-Contentはあなたに[Regex]::Matchesが扱わないストリングのリストを提供します。

    $hostsFile = "$env:windir\System32\drivers\etc\hosts" 
    $entries = Get-Content $hostsFile -Encoding Ascii -Raw 
    
    $hostsRegex = [Regex]'(?m)^\s*(?<Address>[0-9.:]+)\s+(?<Host>[\w.-]+)' 
    $hostsRegex.Matches($entries) 
    

    が問題なく機能します。

    正規表現内の(?m)マルチライン修飾語に注意してください。また、文字クラス内で.,:または-をエスケープする必要はありません。

    最後に式を[Regex]にまっすぐに流し込んで、後で「静的メソッド」のフープをジャンプする必要がなくなります。

    +0

    ' -raw'を使用して、私の問題を解決しました(メソッド呼び出しで 'Multiline'パラメータ)。ありがとう! –

    関連する問題