Powershell 根据文件扩展名将文件移动到适当的位置

Powershell 根据文件扩展名将文件移动到适当的位置,powershell,file-management,Powershell,File Management,我有一个清理脚本,可以根据扩展名将文件移动到适当的预设位置 例如,扩展名为.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

我有一个清理脚本,可以根据扩展名将文件移动到适当的预设位置

例如,扩展名为.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"
我充分意识到,这是以一种不雅的方式实现我的目标。因此,我想知道如何修改脚本,以便

  • 重用重复代码
  • 如果目标文件夹不存在,则应创建它
  • 对类似的扩展进行分组,如png和jpg
  • 测试。不管理分组的(非递归)解决方案:

    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 }
    这是我的工作测试

    $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语句进行进一步检查。

    我已经测试了非分组解决方案,它对我很有效。我将测试分组解决方案并让您知道。谢谢。:-)+1.很酷:)只有一个问题。是否有任何理由使用ls“$($dirtyfolder)/*”而不是ls$dirtyfolder/*?我试过了,两个命令都是相等的。@nick rulez:不太可能,因为它没有经过测试,我更确信:)。很高兴知道,我将简化答案。啊,好的。我懂了。非常感谢@empo:分组解决方案对我不起作用。它给出了错误:术语“get destbytype”未被识别为cmdlet、函数、脚本文件或可操作程序的名称
    $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(".",""))}