Пакетный файл для удаления файлов из папки, имена файлов которых не указаны в файле XML - PullRequest
0 голосов
/ 03 апреля 2012

Работа с командным файлом за последние 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>

результат сценария партии Аасини:

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 . . .

При этом удаляются все файлы в папке.

1 Ответ

1 голос
/ 03 апреля 2012

Простите. В своем вопросе вы сказали: «У меня есть папка с именем 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"
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...