将超过特定大小的文件移动到特定目录(并排除特定的子目录)

时间:2014-01-27 11:23:15

标签: powershell robocopy

背景

最近注册了50GB box account我上传了我的电脑的照片集。但是,我的大多数目录都包含子目录,其文件大于允许的单个文件上载限制 250MB 。因此需要做一些准备工作

我搜索了期望看到robocopy解决方案的问题,但是Jugal Shah找到了这个有趣的powershell脚本。基于我以前不存在的powershell知识,我安装了必要的文件,用Google搜索了一下,然后将下面的脚本混合在一起,这些脚本用于我的基本测试。

问题

在我对我的宝贵实际文件进行操作之前,我有几个问题(支持是,但始终保持谨慎)。

  1. 我的方法下面的任何重大问题都可以而且应该改进吗?
  2. 我的测试偶然发现该脚本无法在隐藏文件夹上运行 - 此功能是排除特定目录(例如 2013 2014 )的最佳方法预先编写脚本,还是可以直接在powershell中完成?
  3. 脚本

    #Mention the path to search the files
    $path = "c:\temp"
    ##Find out the files greater than equal to below mentioned size
    $size = 249MB
    ##Limit the number of rows
    $limit = 10000
    ##Find out the specific extension file
    $Extension = "*.*"
    ##script to find out the files based on the above input
    get-ChildItem -path $path -recurse -ErrorAction "SilentlyContinue" -include $Extension | ? { $_.GetType().Name -eq "FileInfo" } | where-Object {$_.Length -gt $size} | Move-Item -Destination C:\misc
    

    我的目录结构(第一级) enter image description here

2 个答案:

答案 0 :(得分:3)

一些建议。

  1. 您需要将结果传递给Foreach对象,以便您可以移动每个文件。
  2. 您可以使用-whatif来测试移动操作。
  3. 我喜欢通过编写输出来仔细检查我正在做什么
  4. 检查对象是文件还是目录的常用方法是使用.PSIsContainer
  5. 使用烟斗时,您可以转到下一行以便于阅读。

    get-ChildItem $path -recurse -ErrorAction "SilentlyContinue" -include $Extension | 
        Where-Object { !($_.PSIsContainer) -and $_.Length -gt $size } | 
        ForEach-Object {
            Write-Output "$($_.fullname) $($_.Length / 1Mb)"
            Move-Item $_.fullname C:\misc -whatif
        }
    

答案 1 :(得分:1)

我非常支持使用PowerShell尽我所能。但是,在这些类型的操作上没有任何东西可以胜过robocopy!以下是Robocopy语法的TechNet Article。请密切注意文件选择选项部分,您可以在其中介绍/ max:参数,您可以在其中指定最大文件大小。因此,在您的实例中,您需要指出:/ max: 262144000以便您获得小于250 MB的所有文件。