按类型组织文件

时间:2011-06-25 12:06:34

标签: powershell powershell-v2.0

我有这个脚本定期运行以收集桌面文件,并按文件类型将它们组织到备份驱动器上的单个文件夹中。

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文件夹而.csv文件转到spreadsheets文件夹,并且脚本不区分.cs.csv

如何修改脚本以不执行此操作?

还可以做些什么来排除扩展名为.lnk的桌面快捷方式?

4 个答案:

答案 0 :(得分:3)

尝试使用更具体的正则表达式。只需在表达式的末尾添加$符号即可。 $符号表示行尾或您的字符串结尾。

看起来像这样:

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

您可以通过打开PowerShell并输入以下内容来轻松测试:

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

这将导致错误。

答案 1 :(得分:3)

另一个最佳做法是在每个条件结束时添加一个break语句。也就是说,当找到匹配时,不测试所有其他条件。它还可以使比较更快。

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

答案 2 :(得分:2)

更具体的正则表达式是一种可能的解决方案。更方便处理器的是将switch语句从最大特定到最不具体,并在每个case之后包含一个'break'指令。这样,当你匹配“csv”时,它将退出评估其他情况。

您的错误输出是两种情况匹配并返回两个值的结果。更严格的正则表达式只会导致一个案例匹配,但是当你可能既没有意义也没有意识到这种情况发生时,你仍在评估每个元素。在每种情况下使用break指令是一种不那么模糊并节省几个周期的方法。

答案 3 :(得分:0)

您可以在ls的参数中添加快捷方式的例外。

$(function(){
    $('select[name=countryId]').on('change',function(){
        $('select[name=stateId]').html('');
        $.ajax({
            url: 'controller_name/get_state?countryId='+$(this).val(),
            type: "GET",
         }).done(function(data) {
            $('select[name=stateId]').html(data);
         }).fail(function() {

         }).always(function() {

        });
    });
});