2011-06-25 60 views
3

我有一個定期運行的腳本來收集桌面文件,並通過文件類型將它們組織到備份驅動器上的單個文件夾中。按類型組織文件

function get-destbytype($ext) 
{ 
    switch ($ext) 
    { 
     { $ext -match '(jpg|png|gif|bmp)'} { "images" } 
     { $ext -match '(divx|mpeg|avi)'} { "videos" } 
     { $ext -match '(cs|js|java|py|class|vbs|jsp)'} { "code" } 
     { $ext -match '(sql|ps1|pl|py)'} { "scripts" } 
     { $ext -match '(zip|7z|rar)'} { "compressed" } 
     { $ext -match '(ppt|pptx|doc|docx|pdf)'} { "documents" } 
     { $ext -match '(csv|xls|xlsx)'} { "spreadsheets" } 
     { $ext -match '(exe|dll|jar|ear|bat|cmd)'} { "executables" } 
     { $ext -match '(txt|log)'} { "text" } 
     { $ext -match '(msg|htm|html|lnk)'} { "miscellaneous" } 
     { $ext -match '(properties|xml|ini)'} { "config" } 
     default {"$ext" } 
    } 
} 

$dirtyfolder = "C:\Documents and Settings\user\Desktop\" 
$org = "$nas\Desktop\ORG" 

ls $dirtyfolder/* | ? {!$_.PSIsContainer} | %{ 
    $dest = "$($org)\$(get-destbytype $_.extension)" 
    if (! (Test-Path -path $dest)) 
    { 
    write-host "creating $dest" 
    new-item $dest -type directory 
    } 
    mv -path $_ -destination $dest 
} 

該腳本已經過徹底測試,在大多數情況下我都能想象得很好。最近,當第一次遇到.csv文件時,它們被移動到名稱爲

code spreadsheets的新文件夾中。

這顯然是因爲.cs文件都應該去code文件夾和文件.csvspreadsheets文件夾,腳本不.cs.csv區分。

如何修改腳本不執行此操作?

也可以做什麼來排除擴展名爲.lnk的桌面快捷方式?

+1

注意,'之開關直接支持的正則表達式的值,而不必在每個測試表達式執行'-match':'切換-regex($ EXT){「(JPG | PNG | 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)$' 

這將導致錯誤。

2

更具體的正則表達式是一種可能的解決方案。更加處理器友好的方法是將switch語句從大多數指定到最不具體的指令,並且在每個case之後包含一個「break」指令。這樣,當你匹配「csv」時,它將退出評估其他情況。

您的錯誤輸出是兩種情況匹配和兩個值都返回的結果。更嚴格的正則表達式只會導致一個案例匹配,但是當您可能既不意味也不會意識到會發生這種情況時,您仍在評估每個元素。在每種情況下使用break指令是避免含糊不清的另一種方法,並且可以節省幾個週期。

3

另一個最佳實踐是在每個條件結束時添加一個break語句。也就是說,當發現一個匹配時,所有其他條件都未經過測試。它也會使比較更快。

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