2011-06-25 7 views
3

私はデスクトップファイルを収集するために定期的に実行されるこのスクリプトを持っており、ファイルタイプごとにそれらをバックアップドライブ上の単一のフォルダに整理します。タイプ別にファイルを整理する

スクリプトは完全にテストされていて、ほとんどの場合はうまく動作しているようです。最近.csvファイルが初めて検出されたとき、ファイル名は

code spreadsheetsという名前で新しいフォルダに移動さ​​れました。

.csファイルがspreadsheetsフォルダにcodeフォルダとファイル.csvに行くことになっているので、これは明らかにされ、スクリプトが.cs.csvを区別しません。

これを行わないようにスクリプトを変更するにはどうすればよいですか?

また、拡張子が.lnkのデスクトップショートカットを除外するにはどうすればよいですか?

+1

注: '-regex切り替える($ EXT){「(| PNG | JPGをGIF | BMP)$ '{return' images '}'(divx | mpeg | avi)$ '{return' videos '} ...} ' 「Get-Help about_Switch'」(http://go.microsoft.com/fwlink/?LinkID=113271)も参照してください。 –

答えて

3

より具体的な正規表現を試してみてください。式の最後に$記号を追加するだけです。 $記号は、行末または文字列の最後の文字を示します。

それは次のようになります。

{ $ext -match '(jpg|png|gif|bmp)$'} { "images" } 

は、あなたが簡単にPowerShellとタイピングを開くことで、これをテストすることができます。

"abc.csv" -match '(cs|xls)$' 

これがFalseになります。

2

より具体的な正規表現は1つの解決策です。よりプロセッサに優しいのは、switch文をほとんどのものから最小のものに順番に並べ、各caseの後に 'break'指示文を含めることです。このようにして、 "csv"にマッチすると、他のケースを評価しなくなります。

あなたの誤った出力は、両方のケースが一致し、両方の値が返された結果です。正規表現が厳密になると、一致するのは1つのケースだけになりますが、これが起こることを意味することも理解していないときも、すべての要素を評価しています。それぞれの場合にbreakディレクティブを使用することは、あいまいさが少なく、数サイクルを節約するもう1つの方法です。

3

もう1つのベストプラクティスは、各条件の最後にbreakステートメントを追加することです。つまり、一致が見つかると、他のすべての条件はテストされません。また、比較が高速になります。 `switch`は、各テスト式で` -match`実行することなく、直接、正規表現の値をサポートしていることを

{ $ext -match '(jpg|png|gif|bmp)$'} { "images"; break} 
関連する問題