3

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

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

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

我的第一次尝试是结合使用命令提示命令和psexec. 下面列出了该脚本。注意我是从批处理命令运行这些的,因此是 double %%

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. 我必须将排除的文件夹存储在文本文件中
4

2 回答 2

1

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

for /d %%a in (R:*) do findstr /i /x /c:"%%~nxa" excludeDirectories.txt || rd /s /q %%a
于 2012-11-30T20:53:07.613 回答
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”会通知“Remove-Item”上的“-Recurse”无法正常工作。好吧,对我来说这没问题。:-)。没有发现不良行为。

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

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

于 2016-06-23T11:06:48.507 回答