2012-11-30 1 views
2

Я долгое время смотрел, но это мой первый вопрос, поэтому я прошу прощения, если я сделаю это неправильно.Рекурсивно удалять папки и исключать определенные из них

Мне нужно рекурсивно удалить все папки и файлы на удаленном компьютере, и я хочу, чтобы определенные папки не удалялись.

Эти исключенные папки перечислены в текстовом файле 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. Я не могу использовать Pow ershell
  5. Я должен хранить исключенные папки в текстовом файле

ответ

0

Это предполагает, что текстовый файл содержит только имена, а не букву диска:

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

Спасибо, сэр. Оно работало завораживающе! Я никогда не мог получить синтаксис правильно. –

+0

Можете ли вы обновить свой ответ, чтобы показать, как это будет работать, если вы хотите исключить папки .svn и их содержимое? – Sjwdavies

+0

@Sjwdavies К сожалению, это не мешает циклу for спускаться в исключенные папки и удалять вложенные папки в нем, но я полагаю, что если вложенные папки .svn-папок имеют согласованные имена, вы можете просто исключить эти имена. – 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 as. (точка), если вы ищете из текущего каталога .
  • Эта команда исключает папки FOLDER_NAME_TO_EXCLUDE.
  • Пути длиной более 260 символов исключают исключения.

    Get-ChildItem: указанный путь, имя файла или оба они слишком длинны.Полноценное имя файла должно быть менее 260 символов, а имя каталога должно быть меньше 248 символов.


Хорошая вещь, что Remove-Item командлет продолжает с остальной частью пути, оставляя те, которые бросают ошибки.

  • ВНИМАНИЕ: При использовании -WhatIf, любые ошибки, как разрешения отказано не показаны. Это может произойти, когда вы на самом деле запускаете командлет с -WhatIf удален.

Одна из проблем заключается в том, что запуск «Get-Help Remove-Item -Detailed» сообщает, что «-Recurse» в «Remove-Item» работает неправильно. Ну, для меня все было в порядке. :-). Никакого плохого поведения не заметили.

Я использовал это, чтобы рекурсивно удалить bin папки из моего базового каталога VS. Это было большим облегчением. :-)

Для получения дополнительной информации о Get-ChildItem прочитать все ответы здесь: Excluding multiple folders when using Get-ChildItem