Organizing files by type

Обновить

November 2018

Просмотры

597 раз

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папку и .csvфайлы в spreadsheetsпапку, и сценарий не различает .csи .csv.

Как изменить сценарий, чтобы не делать этого?

Кроме того, что может быть сделано , чтобы исключить ярлыки на рабочем столе с расширением .lnk?

3 ответы

2

Более конкретно регулярное выражение является одним из возможных решений. Более процессоры дружественного это заказать выписку коммутатора от большинства наименее специфичных и включает в себя «перерыв» директиву после каждого случая. Таким образом, когда вы подходите «CSV», он будет бросить оценки других случаев.

Ваш ошибочный вывод является результатом обоих случаев совпадающих и оба значения возвращаются. Чем плотнее регулярное выражение вызывает только один случай, чтобы соответствовать, но вы по-прежнему оценивать каждый элемент, когда вы, вероятно, ни один не имел в виду и не понял, что это произойдет. Использование директивы останова на каждом конкретном случае еще один способ быть менее неоднозначным и сохранить пару циклов.

3

Попробуйте использовать более конкретное регулярное выражение. Просто добавьте $ знаков в конце ваших выражений. Знак $ обозначает конец строки или в вашем случае конце строки.

Это будет выглядеть следующим образом:

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

Вы можете легко проверить это, открыв PowerShell и набрав:

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

Это приведет к ложным.

3

Еще лучше практика, чтобы добавить заявление перерыва в конце каждого условия. То есть, когда найдено совпадение все остальные условия не проверяются. Это также сделает сравнение быстрее.

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