Пакетный файл для удаления файлов из папки, имена файлов которых не указаны в XML-файле.

Работаю с пакетным файлом за последние 2 дня, но безуспешно :(

Мне нужен скрипт (Bat), который удалит все проекты (в основном vb), не упомянутые в моем списке сборки (xml).

Например: у меня есть папка с именем C:\123, в которой около 15 файлов. У меня есть список сборки (XML-файл), в котором есть 10 имен файлов, которые находятся в C:\123. Теперь мне нужен сценарий пакетного файла, который удалит остальные 5 файлов из C:\123, которых нет в файле xml.

Любая помощь будет оценена! скрипт пытался сравнить 2 папки и сначала удалить идентичные файлы (подумал о настройке позже в соответствии с моими потребностями, но это не сработало)

@ECHO OFF

SET LOCALFOLDER=C:\123
SET OTHERFOLDER=D:\123

Pause
:LOCALKEYTEMP

SET FILE=DONE

:: THIS LINE SCANS THE LOCAL FOLDER FOR FILES, 
:: WE CAN USE THIS TO SCAN SEPERATE FILES ONE AT A 

TIME

FOR /F "TOKENS=*" %%G IN ('DIR/B ^"%LOCALFOLDER%

\*.*^"') DO SET FILE=%%G
Pause
ECHO %FILE%
pause

IF %FILE%==DONE GOTO END
pause

ECHO N|COMP "%LOCALFOLDER%\%FILE%" 

"%OTHERFOLDER%\%FILE%" | FIND "FILES COMPARE OK" > 

NUL
pause

IF ERRORLEVEL 1 GOTO DIFFERENTKEYS
IF ERRORLEVEL 0 GOTO DELETEBOTH
pause

DELETEBOTH

DEL /Q "%LOCALFOLDER%\%FILE%"
DEL /Q "%OTHERFOLDER%\%FILE%"

GOTO LOCALKEYTEMP


DIFFERENTKEYS

:: THIS LINE DELETES THE LOCAL FOLDERS FILES WHICH IS 

NECCESSARY FOR THIS SCRIPT

DEL /Q "%LOCALFOLDER%\%FILE%"

GOTO LOCALKEYTEMP


:END
ECHO ALL FILES SHOULD BE DELETED FROM 

%LOCALFOLDER%
pause
ECHO ALL DIFFERENT FILES SHOULD BE LEFT ON 

%OTHERFOLDER%
PAUSE

EXIT

xml-файл выглядит так:

<ProjectsToBuild>
    <Project>C:\123\Clients\Direct\App1.vbproj</Project>                      
    <Project>C:\123\Clients\Direct\App2.vbproj</Project> 
</ProjectsToBuild>

результат пакетного сценария Aacini:

Press any key to continue . . .
List of existent files:
fileName[D:\123\Subfolder1\a1.txt.txt]=1
fileName[D:\123\Subfolder1\a2.txt.txt]=1
fileName[D:\123\Subfolder1\a3.txt.txt]=1
fileName[D:\123\Subfolder1\a4.txt.txt]=1
fileName[D:\123\Subfolder1\buildList.xml]=1
fileName[D:\123\Subfolder2\a1.txt.txt]=1
fileName[D:\123\Subfolder2\a2.txt.txt]=1
fileName[D:\123\Subfolder2\a3.txt.txt]=1
fileName[D:\123\Subfolder2\a4.txt.txt]=1
fileName[D:\123\Subfolder2\buildList.xml]=1
Press any key to continue . . .

Keep these files:
Press any key to continue . . .

Remove these files:
Press any key to continue . . .
Press any key to continue . . .

Это удалит все файлы в папке.


person ashish g    schedule 03.04.2012    source источник
comment
Вы должны предоставить нам две вещи. 1) Что вы пробовали до сих пор и 2) Как выглядит ваш XML-список сборки.   -  person adarshr    schedule 03.04.2012
comment
@adarshhr Спасибо за ваш ответ, Адарш. Я попытался сравнить содержимое двух папок и сначала удалить одинаковые файлы. подумал о настройке его позже в соответствии с моей потребностью. но это, кажется, не работает для меня   -  person ashish g    schedule 03.04.2012
comment
Можете ли вы показать, как выглядит XML? Извините, я не смогу вам помочь, не увидев этого.   -  person adarshr    schedule 03.04.2012


Ответы (1)


Прошу прощения. В своем вопросе вы сказали: «У меня есть папка с именем C:\123, в которой около 15 файлов»; однако в списке сборки есть только два имени, которые находятся в папках на два уровня ниже ниже C:\123. Действительно, в папке C:\123 нет ни одного файла, упомянутого в списке сборки. Я предположил, что вы хотите удалить все файлы в C:\123 на любом уровне, которые не упомянуты в списке сборки (поскольку в списке сборки упоминаются файлы двумя уровнями ниже C:\123). Если это не то, что вы хотите, то пакетный файл необходимо изменить.

@echo off
setlocal
rem Create a list of existent file names in C:\123 *at any level*
for /R "C:\123" %%a in (*.*) do set "fileName[%%a]=1"
ECHO List of existent files:
SET fileName[
ECHO/
rem Process the build list and remove found names from existent files list
ECHO Keep these files:
for /F "tokens=2-4 delims=<>" %%a in (buildList.xml) do (
   if "%%a" == "Project" if "%%c" == "/Project" (
      ECHO fileName[%%b]
      set "fileName[%%b]="
   )
)
ECHO/
ECHO Remove these files:
rem Remove the remaining files
for /F "tokens=2 delims=[]" %%a in ('set fileName[') do (
   ECHO del "%%a"
)
person Aacini    schedule 03.04.2012
comment
Спасибо за ваше время. Мои извинения. Да, я хочу удалить все файлы в C:\123\ на любом уровне, которые действительно не упомянуты в списке сборки!!! Дерево в этом случае будет C:\123, а подпапки - \Clients, \Direct и т.д. Пакетный файл должен иметь возможность обхода подпапок, проверки и удаления файлов, которых нет в списке сборки. Я попробовал ваш скрипт выше, но он у меня не работает :( Помогите, пожалуйста. - person ashish g; 04.04.2012
comment
@ashishg: я добавил несколько команд ECHO, чтобы показать, что происходит. Пожалуйста, скопируйте еще раз пакетный файл выше, запустите его и опубликуйте результаты. - person Aacini; 04.04.2012
comment
Выложил результат работы скрипта. - person ashish g; 04.04.2012
comment
@ashishg: обратите внимание, что последняя команда ECHO del ... показывает только команду для выполнения в качестве теста. Когда вы уверены, что пакетный файл правильный, удалите часть ECHO , чтобы команда была del ..., и УДАЛЯЙТЕ файлы! - person Aacini; 08.04.2012
comment
Я хочу сохранить файлы, которые есть в списке сборки (xml), и удалить остальные. Код фактически удаляет все файлы, если я удаляю ECHO в последней строке. XML-файл выглядит следующим образом: ‹ProjectsToBuild› ‹Project›D:\123\SubFolder1\h1.txt‹/Project› ‹Project›D:\123\SubFolder1\h2.txt‹/Project› ‹Project›D:\123 \SubFolder2\h1.txt‹/Project› ‹Project›D:\123\SubFolder2\h2.txt‹/Project› ‹/ProjectsToBuild› - person ashish g; 09.04.2012
comment
@ashishg: В вашем списке сборок НЕ упоминается ни один файл в папке C:\123! Указанные файлы находятся в папке D:\123 (другой диск). Вы хотите игнорировать диск с файлами в списке сборки? - person Aacini; 10.04.2012
comment
Кроме того, в ваших предыдущих примерах строки ‹Project› имеют пробелы слева. Если в реальных строках слева нет пробелов, необходима модификация в пакетном файле. - person Aacini; 10.04.2012
comment
Пожалуйста, игнорируйте диск с файлами в списке сборки. Я упомянул их просто для примера (вы можете рассматривать любой из них C:\ или D:). Кроме того, пожалуйста, игнорируйте пробелы слева от строк «Проект». - person ashish g; 10.04.2012
comment
@ashishg: вы должны понимать, что пакетные файлы не такие гибкие, как другие языки программирования, и обычно разрабатываются с учетом определенных ограничений. Пакетный файл выше был написан в соответствии с вашим предыдущим описанием и примерами. Пожалуйста, запустите приведенный выше пакетный файл с вашими реальными данными и опубликуйте результат как редактирование вашего вопроса, не как ответ. Если под сообщением Сохранить эти файлы нет имен, значит в строках ‹Проект› слева нет пробелов... - person Aacini; 10.04.2012
comment
Не могли бы вы рассказать мне, как мне удалить пробелы для строк ‹project›. Спасибо за ваше время. - person ashish g; 11.04.2012
comment
@ashishg: Эта команда: for /F "tokens=2-4 delims=<>" %%a... предположим, что имена файлов в списке сборки имеют следующий формат: ‹Project›C:\123\Clients\Direct\App1.vbproj‹/Project› как в вашем XML-файле выглядит так: комментарий выше, то есть : пробелы‹Project›имя_файла‹/Project› обрабатывается как token1‹token2›token3‹/token4›. Если строки в списке сборки действительно имеют такой формат: ‹Project›filename‹/Project›, то команда должна быть: for /F "tokens=1-3 delims=<>" %%a.... Вы НЕ разместили настоящий xml-файл, поэтому я могу только догадываться... :( - person Aacini; 12.04.2012