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

时间:2012-11-30 20:27:51

标签: batch-file command-prompt batch-processing

我是一位长期观众,但这是我的第一个问题,所以如果我做错了,我会道歉。

我需要以递归方式删除远程计算机上的所有文件夹和文件,并且我希望阻止删除特定文件夹。

这些排除的文件夹列在名为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. 上的文件夹
  3. 检查FOR循环中的每个文件夹,看它是否在文本文件中
  4. 如果在文本文件中找到FOR循环中的当前文件夹,请跳过删除该文件夹的行并前进到FOR循环中的下一个文件夹
  5. 我不能使用powershell
  6. 我必须将排除的文件夹存储在文本文件中

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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实际运行cmdlet时,可能会发生这些情况 除去。

但有一个问题是运行' Get-Help Remove-Item -detailed'通知' -Recurse'在'删除项目'不能正常工作。好吧,对我来说这没关系。 :-)。没有注意到不良行为。

我曾使用它来递归删除VS解决方案基目录中的 bin 文件夹。这是一个很大的安慰。 : - )

有关Get-ChildItem的详细信息,请阅读以下所有答案:Excluding multiple folders when using Get-ChildItem