2

私は次のPowershellコードを持っています

ls "*.zip" | % {
    $name = $_.name
    if (-not ($name -match '(?<x>\d\d)(?<y>\d{4})\.zip')) { continue }
    $p = $matches["y"] + $matches["x"]
}

コードはISEでうまく機能します。ただし、コマンドラインシェルで実行すると、次のエラーが発生します。

Cannot index into a null array.
At line:3 char:19
+     $p = $matches[ <<<< "y"] + $matches["x"]
    + CategoryInfo           : InvalidOperation: (y:string) [], RuntimeException
    + FullyQualifiedErrorId : NullArray

中かっこをあまり多くインデントしたくなかったので、編集
し ます。if (-not ...) { continue }問題を修正しました-not ()。(ただし、エラーとは関係ありませんが、名前が常にxxx999999.zipのパターンであるファイルをテストしました)

4

3 に答える 3

3

最初に')'が後にあり.zip'ません(おそらくタイプミス)

次に、マッチの周りに()を追加してみてください

ls "*.zip" | % { 
    $name = $_.name 
    if (-not ($name -match '(?<x>\d\d)(?<y>\d{4})\.zip$')) { continue } 
    $p = $matches["y"] + $matches["x"] 
} 

第三continueに、パイプの端を処理することを避けてください、あなたは試すことができます

ls "*.zip" | % { 
    $name = $_.name;
    Write-Host $name;
    if ($name -match '(?<x>\d\d)(?<y>\d{4})\.zip$'){
    $p = $matches["y"] + $matches["x"] 
    }
} 

Powershellコマンドラインでも機能します

ls "*.zip" | % {$name = $_.name; if ($name -match '(?<x>\d\d)(?<y>\d{4})\.zip$') { $p = $matches["y"] + $matches["x"]}}
于 2012-08-03T03:46:52.083 に答える
2

問題は、if演算子の優先順位です。

-not $name -match '...'

として解析されます

(-not $name) -match '...'

したがって、あなたは

'False' -match '...'

これは一致しないため、$Matches空です。ISEでは、おそらく$Matches以前のテストで古いものがまだ横になっています。

簡単な解決策として、次を使用して-notmatchください:

$name -notmatch '...'

これはあなたが期待することをします。または、操作の前後に括弧を追加します-matchが、否定された演算子の方が簡単です。

編集:あなたの答えに対する彼のコメントのJPBlancは実際には正しいです、ここでのより根本的な問題は、continueそれが最初に適用されたときにパイプラインをすぐに終了するために機能できないことです。したがって、実際には次の方法を使用する必要があります。

if ($name -match '...') {
  ...
}

しかしもちろん、上-notからの問題はまだ1つでしたが、それを解決してもあまり役に立ちません。

于 2012-08-03T05:40:02.813 に答える
-3

スコープの問題のようです。ISEでは、$matchesはコードの後に​​表示されますif。ただし、コマンドラインシェルでは、のスクリプトブロックでのみ視覚的に表示されますif

Powershellには、厳密な言語定義が必要です。


ただし、すべての状態が1行に書き込まれる場合は異なります。

ls | %{ $name = $_.name; if (-not ($name -match '(?<d>dip)')) { continue; };  $p = $matches["d"]; "$name : $p"  }

Powershellが予測できない場合があります。

于 2012-08-03T04:54:28.307 に答える