我是一位长期观众,但这是我的第一个问题,所以如果我做错了,我会道歉。
我需要以递归方式删除远程计算机上的所有文件夹和文件,并且我希望阻止删除特定文件夹。
这些排除的文件夹列在名为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
行分支出来
再次,为了击败死马,我想要完成的是:
R:
驱动器FOR
循环中的每个文件夹,看它是否在文本文件中FOR
循环中的当前文件夹,请跳过删除该文件夹的行并前进到FOR
循环中的下一个文件夹答案 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
Get-ChildItem:指定的路径,文件名或两者都太长。完全限定的文件名必须少于260个字符,目录名必须少于248个字符。
好消息是,Remove-Item cmdlet会继续执行其余路径,而不会抛出错误。
但有一个问题是运行' Get-Help Remove-Item -detailed'通知' -Recurse'在'删除项目'不能正常工作。好吧,对我来说这没关系。 :-)。没有注意到不良行为。
我曾使用它来递归删除VS解决方案基目录中的 bin 文件夹。这是一个很大的安慰。 : - )
有关Get-ChildItem的详细信息,请阅读以下所有答案:Excluding multiple folders when using Get-ChildItem