1

Мне нужно удалить все файлы и папки из определенной родительской папки, кроме тех, которые имеют .svn в качестве имени папки и тех, которые имеют * .svn-base в качестве имени файла.

Есть ли сценарий Windows, который может сделать это для меня?


Edit1

@Mizo - ваше решение вернуло следующее, уничтожив все:

C:\temp>clean-all-except-svn.bat
File not found - *.svn_base
0 File(s) copied
0 File(s) copied

Я изменил ссылку clean.bat в самом файле.


Edit2

Я исправил опечатку следующим образом, но ошибка все та же

XCOPY /Q /Y *.svn-base __cltmp


C:\temp>clean-all-except-svn.bat
File not found - *.svn-base
0 File(s) copied
0 File(s) copied

Edit3

(а) это продолжает подсказывать мне

Confirm
The item at C:\temp\f\a\d has children and the Recurse parameter was not specified. If you continue,
all children will be removed with the item. Are you sure you want to continue?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"): 

(б) Он отображает тысячи сообщений, таких как:

At line:1 char:86
+ get-childitem C:\temp\ -exclude *.svn-base,".svn" -recurse | foreach ($_) {remove-item <<<<  $_.fullname}
    + CategoryInfo          : PermissionDenied: (change_email.php.svn-base:FileInfo) [Remove-Item], IOException
    + FullyQualifiedErrorId : RemoveFileSystemItemUnAuthorizedAccess,Microsoft.PowerShell.Commands.RemoveItemCommand
Remove-Item : Cannot remove item C:\temp\admin\.svn\text-base\change_email_submit.php.svn-base: Not Enough permission to
 perform operation.

2 ответа2

1

clean.bat:

@ECHO OFF
FOR /F "tokens=*" %%d IN ('dir /B /AD') DO IF NOT %%d==.svn RMDIR /S /Q %%d
MD __cltmp
XCOPY /Q /Y *.svn_base __cltmp
FOR /F "tokens=*" %%f IN ('dir /B /A-D') DO IF NOT %%f==clean.bat DEL /F /Q %%f
XCOPY /Q /Y __cltmp\* .
RMDIR /S /Q __cltmp
0

Использование Powershell:

get-childitem C:\folder\ -exclude *.svn-base,".svn" -recurse | foreach ($_) {remove-item $_.fullname}

Обновление: код ниже должен делать то, что вы хотели. Он удаляет все файлы, кроме * .svn-base, и не удаляет ЛЮБЫЕ папки.

Некоторые примечания:gci - это псевдоним get-childitem , просто для экономии места. Добавлен параметр -Force для remove-item поскольку у вас, похоже, есть какая-то проблема с разрешениями.

gci C:\folder\ -exclude *.svn-base -recurse | foreach ($_) {if(!$_.PSIsContainer){remove-item -Force $_.fullname}}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .