按类型组织文件

| 我有此脚本,该脚本会定期运行以收集桌面文件,并按文件类型将它们组织到备份驱动器上的单个文件夹中。
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
。 如何修改脚本以不执行此操作? 还可以做些什么来排除扩展名为“ 9”的桌面快捷方式?     
已邀请:
        尝试使用更具体的正则表达式。只需在表达式末尾添加$符号。 $符号表示行尾或您的情况下的字符串结尾。 它看起来像这样:
{ $ext -match \'(jpg|png|gif|bmp)$\'} { \"images\" }
您可以通过打开powershell并键入以下内容来轻松地进行测试:
\"abc.csv\" -match \'(cs|xls)$\'
这将导致错误。     
        另一个最佳实践是在每个条件的末尾添加一个break语句。也就是说,当找到匹配项时,不会测试所有其他条件。这也将使比较更快。
{ $ext -match \'(jpg|png|gif|bmp)$\'} { \"images\"; break}
    
        更具体的正则表达式是一种可能的解决方案。一种对处理器更友好的命令是将您的switch语句从最具体到最不具体地排序,并在每种情况后添加一个'break'指令。这样,当您匹配“ csv”时,它将退出评估其他情况。 您的错误输出是两种情况匹配且都返回了两个值的结果。较严格的正则表达式仅导致一种情况匹配,但是当您可能既不打算也未意识到会发生这种情况时,您仍在评估每个元素。在每种情况下使用break指令是减少歧义并节省几个周期的另一种方法。     
        您可以在ls的参数中添加快捷方式的例外。
ls $dirtyfolder/* | ? {(!$_.PSIsContainer) -and !($_.extension -eq \".lnk\")}
    

要回复问题请先登录注册