【问题标题】:Moving files to appropriate location based on their extension根据扩展名将文件移动到适当的位置
【发布时间】:2011-08-17 02:31:21
【问题描述】:

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

例如,扩展名为 .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"

我完全意识到这是以一种不雅的方式来实现我的目标。所以我想知道如何修改脚本以便我可以

  1. 重复使用重复代码
  2. 如果目标文件夹不存在,则应创建它。
  3. 对类似的扩展名进行分组,例如 png 和 jpg

【问题讨论】:

    标签: powershell file-management


    【解决方案1】:

    经过测试。不管理分组的(非递归)解决方案:

    ls $dirtyfolder/* | ? {!$_.PSIsContainer} | %{ $dest = "$($org)ORG\$($_.extension)" if (! (Test-Path -path $dest) ) { 新项目 $dest 类型目录 } mv -path $_.fullname -destination $dest }

    分组解决方案:

    ls $dirtyfolder/* | ? {!$_.PSIsContainer} | %{ $dest = "$($org)ORG\$(get-destbytype $_.extension)" if (! (Test-Path -path $dest) ) { 新项目 $dest 类型目录 } mv -path $_.fullname -destination $dest }

    其中get-destbytype 是以下函数:

    函数 get-destbytype($ext) { 开关 ($ext) { {$ext -match '(jpg|png|gif)'} { "图像" } {$ext -match '(sql|ps1)'} { "脚本" } 默认 {"$ext" } } }

    【讨论】:

    • 我已经测试了非分组解决方案,它对我来说效果很好。我将测试分组解决方案并让您知道。谢谢。 :-)
    • +1。非常酷:) 只有一个问题。是否有任何理由使用 ls "$($dirtyfolder)/*" 而不是 ls $dirtyfolder/* ?我试过了,两个命令都是相等的。
    • @nick-rulez:不是真的,因为它是未经测试的,我更确定:)。很高兴知道,然后我将简化答案。
    • 啊,好的。我知道了。非常感谢。 ;)
    • @empo:分组解决方案对我不起作用。它给出了错误:术语“get-destbytype”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称
    【解决方案2】:

    这是我的工作测试

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-13
      • 2013-08-03
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多