web-dev-qa-db-ja.com

PowerShellでの文字列の照合

この質問の要点は次のとおりです。

したがって、if ($C -match $b.Name)は、文字列のpartial一致を一致と見なすようですか?文字列のcomplete[match]を強制するより良い方法はありますか?

.7zファイルが大量に含まれるディレクトリがあります。このディレクトリを常にクリーンアップする必要があります。ここで私の就職前の別のスクリプトがあり、現在は機能していますが、これは3000行で構成されており、不正確な一致を常に生成し、移動したものや削除したものをログに記録しません。これを非常に大きくする理由の1つは、これらのファイルをハードコーディングするために移動する必要がある場所へのパスが大量にあることです。時々、これらのパスは変更され、更新するのはお尻の痛みです。

そのため、CSVファイルで参照されるこれらすべてのパスを含むはるかに小さなスクリプトの作成を開始しました。これらのパスに加えて、CSVファイルには既知のファイル名が記録されています。

ファイル名をCSVファイルの録音名と照合しようとしています。通常は機能しますが、一致しない場合があります。

Apple and Apple_Pie。Apple will match to Apple and move to the正しいディレクトリですが、Apple_Pieは最初にApple=に一致し、間違ったディレクトリに移動します。_$C_変数がクリアされる前に、Apple_Pieを正しいディレクトリに一致させますが、その時点でApple_Pieは、移動元の元のディレクトリには存在しません。

つまり、if ($C -match $b.Name)は、文字列の部分一致を一致と見なしているようです。文字列を完全に強制するより良い方法はありますか?

私は、_-match_ shouldがどのように機能するかについての私の期待に少し遅れていると思います。

ここにある正規表現は、別の自動プロセスによってファイル名に追加される日時の各ファイル名を取り除くことです。これを使用して、照合するファイル名を分離します。

_$Wild = "C:\Some\Folder\With\Files\"

$CSV = "C:\Another\Folder\Paths.csv"

$Content = gci $wild

$Reg1 = [regex] '_[0-9]{4}-[0-9]{2}-[0-9]{2}[A-Z]{1}[0-9]{2}_[0-9]{2}_[0-9]{2}'

$Reg2 = [regex] '[0-9]{4}-[0-9]{2}-[0-9]{2}[A-Z]{1}[0-9]{2}_[0-9]{2}_[0-9]{2}'

$Paths = import-csv -path $CSV -header Name, Path

foreach ($a in $content) {
    $c = $a.BaseName

    if ($c -match $reg1) {
        $c = $c -replace $regyear
    }
    elseif ($c -match $reg2) {
        $c = $c -replace $reg2
    }

    foreach ($b in $Paths) {

        if ($c -match $b.Name) {
            Do something
        }
    }
}
_
3
Ochuse

あなたの主な問題は、「マッチ」を使用していることだと思います。

期待どおりの実際の一致であるかどうかではなく、右側の文字列が左側の文字列の一部であるかどうかをチェックします。

$a = "Test"
$b = "Test_me"

$a -match $b
False

$b -match $a
True

-match-likeに置き換えます。

1
BlueBunny