Пакетный файл для анализа XML-файла и копирования файлов в другую папку - PullRequest
0 голосов
/ 10 мая 2018

Я пишу командный файл ( test.bat ), который в настоящее время выглядит следующим образом:

SET DIR_WORKING=%cd%
SET DIR_RELEASE=%DIR_WORKING%\Release

for /F "tokens=1,* delims=]" %%p in ('c:\WINDOWS\System32\find.exe "?define TRIALFILE" %DIR_WORKING%\Include.wxi') do (
   set PFILE=%%p

   for /F "tokens=*" %%s in ("%PFILE%") do set PFILE=%%s

   set PFILE="%PFILE:~23,250%"
   set PATCHFILE="%PFILE:~0,-3%"]

   COPY "%PATCHFILE" %DIR_RELEASE%
)

Я пытался выполнить синтаксический анализ XML-файла с именем Include.wxi , получить пути к некоторым файлам .txt, а затем скопировать эти файлы .txt в Release папка.

Вот как выглядит Include.wxi :

<?xml version="1.0" encoding="utf-8"?>
<Include>
   <?define TRIALFILE001="%DIR_WORKING%\Users\K\Documents\Test\v1.txt"?>
   <?define TRIALFILE002="%DIR_WORKING%\Users\K\Documents\Test\v2.txt"?>
</Include>

Вот как выглядит моя файловая структура:

File structure

Я пытался максимально упростить проблему. Я буквально перепробовал все, чтобы решить эту проблему, но CMD всегда дает мне самые расплывчатые ошибки ... Я не могу понять, как заставить работать вложенные циклы. Пожалуйста, помогите

Ответы [ 3 ]

0 голосов
/ 10 мая 2018
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "filename1=%sourcedir%\q50264822.txt"
SET "DIR_WORKING=u:\destdir"
SET "DIR_RELEASE=%DIR_WORKING%\Release"
MD "%dir_release%" 2>nul

FOR /f "tokens=3delims=<?=>" %%a IN ('c:\WINDOWS\System32\find.exe "?define TRIALFILE" "%filename1%" ' ) DO (
 CALL ECHO(COPY "%%~a" "%DIR_RELEASE%"
)

GOTO :EOF

Вам необходимо изменить настройки sourcedir и destdir в соответствии с вашими обстоятельствами.

Я использовал файл с именем q50264822.txt, содержащий ваши данные из include.wxi для моего тестирования.

Требуемые команды COPY просто ECHO отредактированы для целей тестирования. После того как вы убедились, что команды верны , измените ECHO(COPY на COPY, чтобы фактически скопировать файлы. Добавьте >nul для подавления сообщений отчета (например, 1 file copied)

Основой вашей проблемы является то, что вы не вызываете средства delayed expansion (# 1 FAQ по SO / batch - используйте средство search, чтобы найти много, много примеров), так как вы изменяете значение переменной в пределах code block (набор команд в скобках)

Еще одним осложнением является использование ушей кролика. В SO принято использовать синтаксис set "var=value" для строковых присваиваний, поскольку это гарантирует, что паразитные пробелы в строке игнорируются. Кроме того, стандартная практика SO - НЕ назначать кавычки для значения , так как это создает проблемы с соответствующим удалением нежелательных кавычек при объединении переменных.

Итак - установив переменные, создайте каталог назначения (в противном случае команды copy создадут файл) и используйте 2>nul для подавления сообщений об ошибках в месте назначения уже существует.

Затем прочитайте соответствующие строки из вашего файла, используя соответствующие разделители. O Выберите имя файла, необходимое в качестве токена от 3 до %%a - мысленно отметив, что оно будет заключено в кавычки.

call copy сначала удаляет кавычки из %%a, используя ~, затем цитирует и оценивает результат, заменяя %dir_working%. Оценка выполняется в подоболочке, поэтому delayed expansion не требуется.

0 голосов
/ 10 мая 2018

Возможно, этого будет достаточно:

@For /F Tokens^=2Delims^=^" %%A In ('Find "?define TRIALFILE" include.wxi') Do @Copy "%%A" Release 2>Nul
0 голосов
/ 10 мая 2018
@echo on
setlocal

SET "DIR_WORKING=%cd%"
SET "DIR_RELEASE=%DIR_WORKING%\Release"

if not exist "%DIR_RELEASE%" md "%DIR_RELEASE%"

for /F "tokens=1-2 delims=<?>" %%p in ('
 ""%systemroot%\system32\find.exe" "?define TRIALFILE" "%DIR_WORKING%\Include.wxi""
') do call :copyfrom %%p %%q
exit /b

:copyfrom
if not "%~1" == "define" exit /b 1
copy /y "%~3" "%DIR_RELEASE%"
exit /b 0

Разделение специальными символами тегов xml, которые не являются допустимо в путях к файлам. Жетоны 1-2 получат отступ и define ...=... или просто define ...=..., если нет найден отступ.

Вызов метки :copyfrom с токенами приведет к аргументы с использованием правил cmdline. Отступ в токене будет игнорироваться как пространство. define ожидается в качестве аргумента 1 и проверено на этикетке для подтверждения. Имя тега xml перед символ = будет аргументом 2. Путь к копированию будет после символа =, который будет аргументом 3.

Команда в цикле for содержит более 2 двойных кавычек и двойные кавычки на обоих концах, поэтому cmd лишит внешнего двойные кавычки, поэтому я добавил дополнительные двойные кавычки на внешнем, так что вместо них их раздевают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...