2016-10-25 5 views
2

PowerShellの拡張型の配列から/マッチファイルの種類の拡張子を抽出する方法。ファイル名がまだ一致していない拡張子が含まれています。私は以下のロジックを使用していますが、それは100%正しく動作していない <p>PowerShellの</p>を使用してSharePointライブラリからのみ必要なファイルの種類を抽出したい

スクリプトを修正してください。

$libfiles = ".pptx",".xlsx",".xls",".docx",".doc",".pdf",".jpeg",".jpg",".ppt",".xlsm",".gif",".png" 
$libfilesregex = [string]::Join('|', $libfiles) 
$arr = @("xlsfile.avi","asxlsxfile.mdf","navigation.css") 
foreach($i in $arr) 
{ 
    if($i -match $libfilesregex) 
    { 
     Write-Host " $($i) File type exists " 
    } 
    else 
    { 
     Write-Host " $($i) File type does not exist " 
    } 
} 

出力です:

xlsfile.aviファイルタイプが

asxlsxfile.mdfファイルタイプは

navigation.cssファイルの種類が存在しない存在が存在しません

既存のものとして報告されるべきではないことに注意してください。ただし、予期せぬことにです。

おかげ Vishwa私は単純にリストされている拡張機能の全ての前にピリオド(.) 'をエスケープ'

答えて

2
$libfiles = "(\.pptx)$","(\.xlsx)$","(\.xls)$","(\.docx)$","(\.doc)$","(\.pdf)$","(\.jpeg)$","(\.jpg)$","(\.ppt)$","(\.xlsm)$","(\.gif)$","(\.png)$" 
$libfilesregex = [string]::Join('|', $libfiles) 
$arr = @("xlsfile.avi","asxlsxfile.mdf","navigation.css") 
foreach($i in $arr) 
{ 
    if($i -match $libfilesregex) 
    { 
     Write-Host " $($i) File type exists " 
    } 
    else 
    { 
     Write-Host " $($i) File type does not exist " 
    } 
} 

注意を。これは決して最も効率的な方法ではありませんが、実際に期間自体を表すのではなく、.がRegEx用語で「何か」をどのように表しているかを簡単に示すのに役立ちます。明示的な期間を定義する場合は、バックスラッシュ\を使用して通常の表現をエスケープします。

xlsfile.aviファイルタイプはasxlsxfile.mdfファイルの種類が存在しない

navigation.cssファイルの種類が

とに存在しない存在しません:

は、これはあなたを与えます検証のために肯定的な結果をテストして変更すること。$arr

$arr = @("xlsfile.pptx","pptxlsmgif.mdf","navigation.doc")

収量:

xlsfile.pptxファイルタイプは
navigation.docファイルタイプは

EDITが存在する存在しない
asxlsxfile.mdfファイルの種類が存在する:(より良いのおかげで、効率的な)答え、$libfilesを更新して、docx.xls.ddfのようなファイル名がの場合には、と誤って間違っていると報告しますuldはありません。だから、私はファイル名の "終わり"に固定し、各拡張の末尾に$を使い、括弧で囲んだ。

6

私はこれがあなたが探していると信じています。ファイル配列から明示的にファイル拡張子を抽出し、その拡張子が存在する場合は印刷します。

$libfiles = ".pptx",".xlsx",".xls",".docx",".doc",".pdf",".jpeg",".jpg",".ppt",".xlsm",".gif",".png" 
$arr = @("xlsfile.avi","asxlsxfile.mdf","navigation.css", "lib.pptx") 
foreach($i in $arr) 
{ 
    if($libfiles -contains [io.path]::GetExtension($i)) 
    { 
     Write-Host "$([io.path]::GetExtension($i)) File type exists " 
    } 
    else 
    { 
     Write-Host "$([io.path]::GetExtension($i)) File type does not exist " 
    } 
} 
+2

++正規表現の問題をバイパスする実用的なアプローチです。 PowerShellのようなコードをPowerShellのようなものにすることをお勧めします: '.Contains()'メソッドの代わりに '-contains'演算子、 を使用し、不要な' $(...) 'ラッパーを' [io。 ($ libfiles-contains [io.path] :: GetExtension($ i)){... ' – mklement0

+2

私のポストに建設的なフィードバックをいただきありがとうございます。将来私はそれに応じて自分のコードを調整することを確認します。 – jdwal

1

働くあなたの正規表現(正規表現)を作ることを目的として、二つのものが必要です:

  • あなた必要がありエスケープ正規表現のメタ文字(特別な意味を持つ文字は、そのような.)で探す文字列。 \は、あなたがハードコードは、あなたの正規表現のコンポーネントにエスケープすることもできますがそうリテラル.\.

    • として表現されなければならない、それは常にオプション面倒ではありませんが、エスケープに使用されます。幸いにも、.NETフレームワークは、任意の文字列の一般的なエスケープのために[regex]::Escape()を提供します。あなたはファイル名の拡張子に一致していることをことと-matchオペレータは、デフォルトでサブマッチングを実行することをアンカー$と入力文字列の最後に正規表現を、与えられなければなら

あなたの偽陽性の理由は、入力ファイル名asxlsxfile.mdfのサブsxlsx

に次のコマンドを部分式.xlsxと一致させる、これらの二つの側面の不在だっただけのことを行います。

$libfilesregex = '(' + (($libfiles | % { [regex]::Escape($_) }) -join '|') + ')$' 

$libfilesregexには次が含まれます。

(\.pptx|\.xlsx|\.xls|\.docx|\.doc|\.pdf|\.jpeg|\.jpg|\.ppt|\.xlsm|\.gif|\.png)$ 

これは、所望の結果をもたらす。

+1

私はこれが大好きです。正規表現の統合に伴う連結。非常に素晴らしい。 – gravity

関連する問題

 関連する問題