2017-02-15 112 views
0

我目前正在处理我的第一个初级IT职位,并且遇到了一个简单的批处理文件问题。计划文件夹清理 - 批处理文件

本质上,该文件每周通过任务计划程序运行。它从大于8天的服务器目录中删除文件和文件夹。它也应该删除空的文件夹。

forfiles /p "P:\blahblah" /s /m * /d -8 /c "cmd /c del /Q /S /F /A @path" 
cd /d P:\blahblah 
for /f "usebackq" %%d in (`"dir /ad/b/s | sort /R"`) do rd "%%d" 
REM robocopy "P:\blahblah" "P:\blahblah" /s /move" 

这里有两个问题; 它会偶尔删除几天前的文件。 它不会删除空文件夹。

该文件是由一位老初级IT员工编写的,没有任何文档。我的猜测是使用了多种方法来确保清理(具有讽刺意味)。我已经搜索谷歌,这里是我对每个命令的当前想法..

1)forfiles - forfiles命令似乎写入正确,我没有看到任何问题。 3)for - 不完全确定。3)for - 不完全确定。3)for - 不完全确定。批处理变量对我来说是新的,我不确定它是否正常工作。

4)robocopy - 我一直无法在网上找到一个实例,在那里有人将一个目录复制到自己进行清理。我还注意到那里有额外的引文,但我不确定它的错误。这条线对我来说似乎很奇怪。

通常我会尝试和测试我通过类似的东西,但它有点难以快速测试,因为我需要看看它是否基于日历日期去除东西。这就是我来这里的原因!

我保证我不会问我是否已经在互联网上寻找一个想法。任何帮助将不胜感激,我想更多地了解上述命令!

感谢您的帮助!

+0

您的FOR命令将失败,因为它缺少脱字符以逃脱PIPE。另外,FOR命令应该使用delims选项来强制它不使用任何分隔符。你不应该需要usebackq选项。 Robocopy不会执行,因为它是用REM命令注释掉的。 – Squashman

回答

0
  1. forfiles

    作为语法正确并不意味着你想要做什么,它做什么你问。这里的问题是del命令。它会删除forfiles已选择的内容,但您应该测试所选元素不是文件夹。如果您使用文件夹引用呼叫del /q /s /f /a,则会删除文件夹内容。

  2. cd

    很简单,但是你不检查操作是SUCESSFUL(也许P:不可用)也许下面for命令,其中它不应该删除的信息。

  3. for

    由于Squashman评论,如果你改变了反引号为单引号,你不会需要usebackq

    但是您需要delims子句来避免包含空格的路径出现问题。for /f不会遍历文件引用,而是遍历文本行(在本例中,由dir命令生成)。默认情况下,制表符和空格是分隔正在处理的行的分隔符,并且默认情况下,只检索第一个标记。将delims子句设置为空的字符列表将禁用此行为。

你可以尝试的东西像

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    pushd "p:\blahblah" && (
     forfiles /s /m * /d -8 /c "cmd /c if @isdir==FALSE del /q /f /a @path" 
     for /f "delims=" %%d in ('" dir /ad /s /b | sort /R "') do rd "%%d" 
     popd 
    ) 

pushd将当前的活动目录切换到所需之一。如果命令成功,则条件运算符&&(如果前一个没有失败,则执行下一个命令)将执行其余代码,最后恢复活动目录。

4)robocopy

它可以用来做清洁,而不是从一个文件夹到自身。

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    pushd "p:\blahblah" && (
     rem Use a random temporary folder 
     for %%t in ("%temp%\clean_%random%%random%%random%%random%.tmp") do (

      rem Select the files to keep 
      robocopy "." "%%~ft" /MAXAGE:8 /CREATE /s /njh /njs /nfl /nc /ns 

      rem Remove anything not selected 
      robocopy "%%~ft" "." /NOCOPY /PURGE /e /njh /njs /nfl /nc /ns 

      rem remove temporary folder 
     ) & rd /s /q "%%~ft" 

     rem Restore previous active directory 
     popd 
    ) 

此代码创建所有选中的文件(年龄不超过8天)到一个临时文件夹的副本,但/CREATE开关告诉robocopy不复制文件,而是要创建0字节文件到临时目标。

一旦我们有一个副本只有选定的元素,oposite操作完成后,从临时文件夹到工作文件夹,但请求不应复制操作(/NOCOPY),只是删除元素不存在源( /PURGE)。

+0

感谢您的帮助MD。我会看看这个并更新我的结果。 – Boognish