递归删除文件夹并排除特定文件夹

3

我是一名长期的观众,但这是我的第一个问题,如果我做错了,请原谅。

我需要递归删除远程计算机上的所有文件夹和文件,并且我想要防止特定文件夹被删除。

这些排除的文件夹列在一个名为 excludeDirectories.txt 的文本文件中,每行一个文件夹名称。

我的第一次尝试是将命令提示符命令与psexec的使用相结合。脚本如下所示。请注意,我是从批处理命令运行这些命令的,因此有双重 %%:

net use r: \\machine\sharedFolderName

FOR /D %%a IN (R:\*.*) DO (
    c:\pstools\psexec cmd /c rmdir /s /q R:\
)

这个脚本会删除所有内容,但我无法弄清如何在循环中检查文本文件以获取当前文件夹,并在找到文件的情况下跳过FOR循环中的下一个文件夹。

我花了几天时间,尝试将文件夹读入到可以在IF语句中使用的东西中,并在找到匹配项时从psexec行中分支出来。

再一次强调,我想要实现的是:

  1. 递归地遍历R:驱动器上的文件夹
  2. FOR循环中检查每个文件夹是否在文本文件中
  3. 如果FOR循环中的当前文件夹在文本文件中找到,则跳过删除文件夹的行并进入FOR循环中的下一个文件夹
  4. 不能使用PowerShell
  5. 必须将排除的文件夹存储在文本文件中
2个回答

1

这假设文本文件只包含名称,而不包含驱动器字母:

for /d %%a in (R:*) do findstr /i /x /c:"%%~nxa" excludeDirectories.txt || rd /s /q %%a

谢谢您先生。它像魔法一样奏效!我以前从来没能弄对语法。 - user1867374
你能否更新你的答案,展示如何排除 .svn 文件夹及其内容? - Sjwdavies
很遗憾,它不能防止for循环进入被排除的文件夹并删除其中的子文件夹,但我想如果.svn文件夹的子文件夹具有一致的名称,那么你也可以将这些名称排除在外。 - Neil
只是在测试中,我发现 excludeDirectories.txt 文件的最后一行被忽略了?也就是说,如果文件列出了 DirA、DirB、DirC,那么命令将跳过 DirA 和 DirB,但会删除 DirC?这是为什么? - mapface
1
@mapface /x开关无法找到最后一行,如果它没有以换行符结尾。有些文本编辑器总是在文件末尾添加一个换行符,但其他编辑器(如记事本)则不会,您需要手动添加它。 - Neil

0

抱歉,我没有注意到您不能使用PowerShell。但是这个答案可能会帮助那些访问此链接的人。

您可以使用PowerShell更好地完成它。我正在使用PowerShell 2.0。

Get-ChildItem -Path BASE_PATH_TO_SEARCH -Include FOLDER_TO_SEARCH -Recurse | ? { $_.FullName -inotmatch 'FOLDER_NAME_TO_EXCLUDE'} | Remove-Item -WhatIf -Recurse
  • 删除文件夹时,请移除-WhatIf开关。使用-WhatIf模拟删除操作,但实际上并不执行。
  • 如果要从当前目录进行搜索,请将BASE_PATH_TO_SEARCH设置为“.”(点)。
  • 此命令排除“FOLDER_NAME_TO_EXCLUDE”文件夹。
  • 路径超过260个字符会引发异常。

    Get-ChildItem:指定的路径、文件名或两者都太长。完全限定的文件名必须少于260个字符,目录名必须少于248个字符。


好处是Remove-Item cmdlet会继续处理其余路径,而忽略那些引发错误的路径。

  • 警告: 在使用-WhatIf时,不会显示任何类似权限被拒绝的错误。这些错误可能在实际运行删除操作时出现,而不带-WhatIf参数。

不过有一个问题,运行“Get-Help Remove-Item -detailed”会提示“Remove-Item”上的“-Recurse”无法正常工作。对我来说,这没问题。:-) 没有观察到任何不良行为。

我曾使用这个递归删除我的VS解决方案基础目录中的bin文件夹,真是一大解脱。 :-)

有关Get-ChildItem的详细信息,请阅读这里的所有答案:在使用Get-ChildItem时排除多个文件夹


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接