【问题标题】:Script to move folders and files with minage使用 minage 移动文件夹和文件的脚本
【发布时间】:2016-09-27 17:30:08
【问题描述】:

我正在使用 robocopy 从目录中删除文件夹/文件。

脚本:

  SET source1=c:\source
  SET destination=F:\destination
  SET switch1=/r:10 /w:1 /e /create /minage:10 /mt /LOG:F:\logs\backup.log

  FOR /d %%i IN ("%source1%\*") DO ROBOCOPY "%%i" "%destination%\%%~nxi" %switch1%
  FOR /d %%p IN ("%source1%\*") DO RMDIR "%%p" /s /q
  FOR /d %%q IN ("%destination%\*") DO RMDIR "%%q" /s /q

源码目录如下:

c:\source\directory\file1.txt(12 天前)

c:\source\directory2\file2.txt(5 天前)

我的问题是脚本中的这一行:

FOR /d %%p IN ("%source1%\*") DO RMDIR "%%p" /s /q

该行不仅仅是从源代码复制的目录的 RMDIR,它会将它们全部删除。请注意,我不能使用 /move 因为它会删除源目录。如果我使用 /mov 它不会删除所有子目录。

有什么想法我在这里做错了吗?提前致谢。

编辑:我包括源目录 dir /tw /s 信息以进行故障排除。 ABT 文件夹是应该删除的文件夹。

 Directory of C:\

09/27/2016  03:08 PM    <DIR>    .
09/27/2016  12:10 PM    <DIR>    ..
09/27/2016  03:09 PM    <DIR>    New Folder
06/25/2014  05:47 AM    <DIR>    abt
               0 File(s)

 Directory of C:\New folder

09/27/2016  03:09 PM    <DIR>
09/27/2016  03:08 PM    <DIR>
09/27/2016  03:09 PM
               1 File(s)

 Directory of C:\abt

06/25/2014  05:47 AM    <DIR>
09/27/2016  03:08 PM    <DIR>
03/20/2014  10:08 AM
06/25/2014  05:47 AM
04/28/2014  02:33 PM
05/20/2014  10:47 AM    <DIR>
02/18/2014  07:24 PM
05/20/2014  10:51 AM
               5 File(s)

 Directory of C:\abt\Scripts

05/20/2014  10:47 AM    <DIR>
06/25/2014  05:47 AM    <DIR>
10/02/2012  11:18 AM
02/02/2012  12:16 PM
02/17/2012  11:32 AM

【问题讨论】:

  • 当然rmdir /S删除所有,这就是它的用途;您可以将/MOVE 选项添加到robocopy,以便将匹配的文件和目录移动 到目的地,然后您可以省略整个for /D %%p 命令行...
  • /move 将删除父目录(源目录)。我需要能够保持这一点。所以它会删除'c:\source'。此外,如果我使用 /mov 则不会删除 'c:\source' 下的子目录。
  • 您可以使用 forfiles 进行年龄测试,然后编写您需要的任何命令。 forfiles /D -10 /C "cmd /c if @isdir==TRUE echo copying @relPath"
  • @FloatingKiwi 我真的希望这会奏效。我试过这个并得到一个错误(命令的语法不正确。)。 FORFILES /P C:\source /M *.* /D -10 /C "CMD /C RMDIR /s /q"
  • @FloatingKiwi :当我尝试这个命令时,我得到了错误(没有找到符合指定搜索条件的文件),但是有超过 10 天的旧目录和文件。 FORFILES /P C:\source /M *.* /D -10 /C "CMD /C RMDIR /s /q @path"

标签: batch-file vbscript robocopy


【解决方案1】:

如果robocopy 可以处理除删除文件夹之外的所有操作,那么您唯一需要做的就是确保robocopy 无法删除该文件夹。

这可以通过将源文件夹设置为当前活动目录来完成。您不能删除正在使用的文件夹。

SET "source1=c:\source"
SET "destination=F:\destination"
SET "switch1=/move /e /create /minage:10 /r:10 /w:1 /LOG+:F:\logs\backup.log"

pushd "%source1%" && (
    robocopy . "%destination%" %switch1%
    popd
)

唯一的缺点是robocopy会显示一个错误,说它不能删除源文件夹,因为它正在使用中。

【讨论】:

  • 这个很酷。但是,当我以这种方式运行批处理时,c:\source1\abt 文件夹的开始日期早于 10 天,我在批处理运行到当前日期后观察到该日期更改。 “abt”文件夹下还有一个“scripts”文件夹,它也曾经有一个超过 10 天的日期,并且该日期在批处理运行后也会更改为当前日期。因此,“abt”文件夹下的所有文件都会移动到目的地,留下“c:\source1\abt”和“c:\source1\abt\scripts”。但是文件夹“c:\source1\New Folder”没有移动或改变。
  • 基本上,它与我最初运行它时发生的事情完全相同,但没有将 source1 设置为当前活动目录,我使用 /mov 命令。
  • 我不知道这是否重要,但 C: 实际上是一个网络共享。为了公共网络的目的,我用 C:\ 掩盖了它。
  • 你在回答中提到的错误信息可以通过2&gt; nul...
  • @TomWildt,文件夹中的日期更改是通常的行为(文件夹日期反映文件夹内的最后更改)。但是如果文件夹没有被删除,那么 1.- 也许/mt 会干扰自己(不,我不这么认为,但是......) 2.- 并非所有文件都被删除,因为它们与选择开关不匹配,所以文件夹不为空,也不会被删除。对于第一个选项,请尝试移除 /mt 开关。第二种情况不能用robocopy 解决,最好的选择是在robocopypopd 行之间包含rmdir . /s /q
猜你喜欢
  • 1970-01-01
  • 2017-02-01
  • 2021-12-26
  • 2018-05-29
  • 1970-01-01
  • 2015-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多