我有一个清理脚本,可以根据文件的扩展名将文件移动到适当的预设位置。
例如,扩展名为.xls的文件将移动到〜\ XLS文件夹,.sql移动到〜\ SQL等。这是我的剧本。
$dirtyfolder = "\\server\c$\Documents and Settings\user\Desktop\"
$org = "\\BACKUPS\users\"
dir $dirtyfolder -fil *.doc | mv -dest "$($org)ORG\doc"
dir $dirtyfolder -fil *.txt | mv -dest "$($org)ORG\txt"
dir $dirtyfolder -fil *.sql | mv -dest "$($org)ORG\sql"
dir $dirtyfolder -fil *.log | mv -dest "$($org)ORG\log"
dir $dirtyfolder -fil *.zip | mv -dest "$($org)ORG\zip"
dir $dirtyfolder -fil *.7z | mv -dest "$($org)ORG\zip"
dir $dirtyfolder -fil *.png | mv -dest "$($org)ORG\img"
dir $dirtyfolder -fil *.jpg | mv -dest "$($org)ORG\img"
dir $dirtyfolder -fil *.mp3 | mv -dest "$($org)ORG\mp3"
我充分意识到这是以不雅的方式实现我的目标。所以我想知道如何修改脚本以便我可以
答案 0 :(得分:5)
测试。不管理分组的(非递归)解决方案:
ls $dirtyfolder/* | ? {!$_.PSIsContainer} | %{ $dest = "$($org)ORG\$($_.extension)" if (! (Test-Path -path $dest ) ) { new-item $dest -type directory } mv -path $_.fullname -destination $dest }
分组解决方案:
ls $dirtyfolder/* | ? {!$_.PSIsContainer} | %{ $dest = "$($org)ORG\$(get-destbytype $_.extension)" if (! (Test-Path -path $dest ) ) { new-item $dest -type directory } mv -path $_.fullname -destination $dest }
其中get-destbytype
是以下函数:
function get-destbytype($ext) { Switch ($ext) { {$ext -match '(jpg|png|gif)'} { "images" } {$ext -match '(sql|ps1)'} { "scripts" } default {"$ext" } } }
答案 1 :(得分:1)
这是我的工作测试
$source = "e:\source"
$dest = "e:\dest"
$file = gci $source | ? {-not $_.psiscontainer}
$file | group -property extension |
% {if(!(test-path(join-path $dest -child $_.name.replace('.','')))) { new-item -type directory $(join-path $dest -child $_.name.replace('.','')).toupper() }}
$file | % { move-item $_.fullname -destination $(join-path $dest -child $_.extension.replace(".",""))}
该脚本将在源文件夹中找到所有不同的扩展名。对于每个扩展名,如果目标中的文件夹尚未存在,则会创建该文件夹。 最后一行将从源循环每个文件并将其移动到右侧子文件夹目标。
如果您想将具有不同扩展名的图像放在同一文件夹中,则需要使用if或switch语句进行进一步检查。