我目前正在我的第一个初级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命令似乎写得正确,我没有看到任何问题。
2)cd - 足够简单
3)因为 - 不完全确定。批量变量对我来说是新的,我不确定它是否正常工作。
4)robocopy - 我无法在网上找到有人将目录复制到自身进行清理的实例。我也注意到那里的额外报价,但我不确定它的不正确性。这条线对我来说特别奇怪。通常情况下,我会尝试通过这样的方式来测试我,但是考虑到我需要查看是否根据日历日期删除内容,快速测试会有点困难。这就是我在这里的原因!
我保证不会问我是不是已经在互联网上搜索过一个想法。任何帮助将不胜感激,我希望更多地了解上述命令!
感谢您的帮助!
答案 0 :(得分:0)
forfiles
在语法上正确并不意味着它能够满足您的需求,它可以满足您的要求。这里的问题是del
命令。它将删除forfiles
已选择的内容,但您应该测试所选元素不是文件夹。如果您使用文件夹参考调用del /q /s /f /a
,则删除文件夹内容。
cd
很简单,但由于您没有检查操作是否成功(可能P:
不可用),可能以下for
命令会删除不应该的信息。
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
)。