1 (изменено: xsanekk, 2013-10-07 22:01:04)

Тема: CMD/BAT: Удаление всех файлов, кроме указанных в переменной

Добрый день! Подскажите как можно решить такую задачку: Есть Папка в ней много подпапок, в каждой папке есть куча файликов вида ГГГГММДД.PRJ, где ГГГГ-год ММ-месяц, ДД-день. Необходимо удалить в папках все файлы кроме заданного в переменной FILENOTDELETE. То есть например нужен оставить сентябрь то маска должна быть 201309??.PRJ  Нашел скрипт, попытался обработать но не получается, в условии не понимает ?? не *, то есть маску не понимает. Как быть? как задать что бы остались только те файлы которые указаны а остальные удалить.

@Echo On
setlocal enabledelayedexpansion
set FILEMASK=*.*
set FILEPATH=F:\AVT\PRJ\
set FILENOTDELETE=201309??.???

for /f %%i in ('dir /b /s "%FILEPATH%\%FILEMASK%"') do if /i not %%i==%%~dpi%FILENOTDELETE% del /f /q "%%i"
pause
exit

2

Re: CMD/BAT: Удаление всех файлов, кроме указанных в переменной

xsanekk, оформите код!

3 (изменено: xsanekk, 2013-10-07 23:44:06)

Re: CMD/BAT: Удаление всех файлов, кроме указанных в переменной

Думаю может следует DIR сначала выбрать все файлы 20130901 02 и т.д. потом сменить атрибут attrib например на только для чтения, после выполнить удаление по атрибутам кроме для чтения, а потом выполнить опять в нормальный атрибут? Кто нибудь подскажет...

4

Re: CMD/BAT: Удаление всех файлов, кроме указанных в переменной

xsanekk, используйте PowerShell:

Get-ChildItem -Path "E:\Песочница\0323\0001" -Include "????????.prj" -Exclude "201309??.prj" -Recurse |`
    ForEach-Object -Process {
        Remove-Item $_ -WhatIf
    }

5

Re: CMD/BAT: Удаление всех файлов, кроме указанных в переменной

Спасибо за ответ! Решил вот таким образом...


set FILEMASK=201309??.???
set FILEPATH=F:\AVT\PRJ\
for /f %%i in ('dir /b /s "%FILEPATH%\%FILEMASK%"') do attrib +r %%i
del /f /q /s /a:-r %FILEPATH%

6

Re: CMD/BAT: Удаление всех файлов, кроме указанных в переменной

Можно было бы использовать FINDSTR с ключом /V для отсеивания из вывода команды DIR строк, удовлетворяющих образцу:

set FILEMASK=*.*
set FILEPATH=F:\AVT\PRJ\
::set FILENOTDELETE=201309??.???
set FILENOTDELETE="\\201309[^:\\][^:\\]\.[^:\\\.][^:\\\.][^:\\\.]$"

for /f "delims=" %%i in ('dir /b /s "%FILEPATH%\%FILEMASK%" ^| findstr /i /v %FILENOTDELETE%') do del /f /q "%%i"

Возможно, регулярное выражение можно было бы упростить или улучшить иным образом.
На самом деле это не совсем то, т.к. «?» соответствует нулю или одному символу, а в предложенном решении будут учитыватся ровно два символа на конце имени файла и расширение из трёх символов. Так что мне самому интересно, как бы это можно было улучшить.