Организация файлов по типу - PullRequest
3 голосов
/ 25 июня 2011

У меня есть этот скрипт, который периодически запускается для сбора файлов рабочего стола и упорядочивает их по типу файла в одну папку на резервном диске.

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 ]

3 голосов
/ 26 июня 2011

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

{ $ext -match '(jpg|png|gif|bmp)$'} { "images"; break}
3 голосов
/ 25 июня 2011

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

Это будет выглядеть так:

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

Вы можете легко проверить это, открыв powershell и введя:

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

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

2 голосов
/ 25 июня 2011

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

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

0 голосов
/ 10 февраля 2019

Вы можете добавить исключение для ярлыков в параметры для ls.

ls $dirtyfolder/* | ? {(!$_.PSIsContainer) -and !($_.extension -eq ".lnk")}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...