8

私の正規表現は Rubular で動作しているのに、PowerShell が期待どおりに動作していないため、これは私を狂わせます。

  1. ネットワーク ディレクトリで Get-ChildItem を実行し、出力を txt ファイルに送信しました。
  2. 次のようなテキスト ファイルからディレクトリ情報を削除しました。

ここに画像の説明を入力

  1. 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で試してみるとうまくいきますが、何が欠けていますか? どんな助けでも素晴らしいでしょう、ありがとう!

4

3 に答える 3

19

Filburtの答えは良いものであり、正規表現がここで使用するのに最適なツールではないようです。しかし、あなたは将来再び混乱を引き起こす可能性のある問題にぶつかりました。ここでの問題は、入力した変数がGet-Content複数行の文字列ではないことです。これは文字列の配列です。

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

に対して正規表現一致を実行すると$var、配列内の各オブジェクト(ファイル内の各行)と個別に一致します。次の行は新しいオブジェクトであるため、行の終わりを超えて一致させることはできません。

ここでの回避策の1つは、文字列の配列を次のように1つの文字列にフラット化することです。

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

Powershellでは、単一のStringオブジェクトを処理しているのか、Stringの配列を処理しているのかを判断するのが難しい場合があります。それらをコンソールに出力すると、同じように見えます。そのような場合、GetType()そしてOut-String便利なツールになり得ます。

編集: Powershell 3.0の時点で、Filesystemプロバイダーにはの-Rawスイッチが含まれていGet-Contentます。そのスイッチGet-Contentは、ファイルをチャンクに分割せずに一度に読み取るように指示します。回避策を使用するよりも大幅に高速です。これはOut-String、ピースを引き離して元に戻すだけの時間を無駄にしないためです。

于 2012-06-13T14:11:06.207 に答える
6

ファイルに出力する前に、目的のプロパティを選択してみませんか?

Get-ChildItem | Select-Object Mode, LastWriteTime, Length, Name | Out-File Result.txt
于 2012-06-13T13:37:54.927 に答える
1

行が で終わらない可能性があり\nます。Windows の標準的な行末文字は\r\n. それに一致するように正規表現を書き直してみてください。

于 2012-06-13T15:00:22.253 に答える