2017-08-03 4 views
1

私は現在、ファイル名に基づいていくつかのファイルを手動で配送する必要があるいくつかの複製ソフトウェアで定期的な問題があります。サイトへのリモートアクセスの速度が遅いために自動化する方法を見つけようとしています。Get-ChildItemを使用して、ファイル名内の数値範囲に基づいてフォルダ内のファイルの範囲を選択します。

例 - 特定のフォルダには、X123456-000123-X.XMLという形式のファイルが多数あります。 '000123'はファイル名の唯一の部分で、増分的に変化し、増加します。 X123456-000123-X.XML 最終ファイル:X123456-000150-X.XML

ファイルは、数千の真ん中内にあってもよいファイルを起動する

:以下のように私は、ファイルを取得するための要求を受信することができます他のファイルは無視することができます。私のPowershellのスキルは合理的ですが、私のRegExは私に解決策がありません。あなたが提供できる援助やアイディアがあれば幸いです!

答えて

1

内蔵正規表現または単純な文字列分割を介して抽出された実際の数確認するWhere-Objectと120から159と一致する範囲ワイルドカード1[2-5][0-9]コンバイン:範囲は予め知られていない場合

Get-ChildItem 'X123456-0001[2-5][0-9]-X.XML' | where { 
    $index = [int]$_.Name.Split('-')[1] 
    $index -ge 123 -and $index -le 150 
} 

を、最初のワイルドカードは*となります。

gci 'X123456-00012[3-9]-X.XML', 'X123456-0001[3-4][0-9]-X.XML', 'X123456-000150-X.XML' 

あなたはこのようなアレイを構築する汎用関数を書くことができる:'X123456-*-X.XML'


別のアプローチは、範囲(123-129、130から149、150)を指定して分割し、征服することです2つの任意の数のワイルドカード。

+0

おかげさまで、ありがとうございました。明日、オフィスに戻って確認するときにテストします! – Steve

+0

@wOxxOm - パフォーマンス上の理由から、 'where'を使用して' filtering'と'where'を好むと思いますか? –

+0

ええ、OPに1kkのファイルがある場合。 – wOxxOm

1

ファイル名とシーケンスが予測可能、あなたはおそらく代わりに数千のファイルを一覧表示し、結果を解析し、それらをフィルタリングしようとしているのスクラッチからそれを生成することができるということです場合:

文字列が書式設定され
$FileNames = 123..150 | ForEach { 'X123456-{0:D6}-X.XML' -f $_ } 

、パディング6桁までの数字。

X123456-000123-X.XML 
X123456-000124-X.XML 
X123456-000125-X.XML 
... 
関連する問題