Batch file 批处理文件以解析XML文件并将文件复制到其他文件夹

Batch file 批处理文件以解析XML文件并将文件复制到其他文件夹,batch-file,cmd,Batch File,Cmd,我正在编写一个批处理文件(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

我正在编写一个批处理文件(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%
)
我一直试图完成的是解析一个名为Include.wxi的XML文件,获取一些.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>

这就是我的文件结构的外观:

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

我尽量简化这个问题。我已经尝试了所有方法来解决这个问题,但是CMD总是给我最模糊的错误。。我似乎不知道如何让嵌套for循环工作。请帮助

@echo打开
@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
setlocal 设置“DIR\u WORKING=%cd%” 设置“DIR\u RELEASE=%DIR\u WORKING%\RELEASE” 如果不存在“%DIR\u RELEASE%”md“%DIR\u RELEASE%” 对于/F“tokens=1-2 delims=“%%p in(' “%systemroot%\system32\find.exe”?定义TRIALFILE”“%DIR\u WORKING%\Include.wxi” “)do call:copyfrom%%p%%q 退出/b :copyfrom 如果不是“%~1”==“定义”退出/b 1 复制/y“%~3”“%DIR\u RELEASE%” 退出/b0
由特殊的xml标记字符分隔,这些字符不是 在文件路径中有效。标记
1-2
将获得缩进 如果没有,则使用
define…=…
或仅使用
define…=…
发现凹痕

使用令牌调用标签
:copyfrom
,将处理 使用cmdline规则的参数。标记中的缩进将 作为空间被忽略<代码>定义应作为参数1 并在标签上测试以验证。之前的xml标记名
=
字符将是参数2。复制的路径将被删除 位于参数3的
=
字符之后

for
循环中的命令有两个以上的双引号 两端都有双引号,因此
cmd
将去掉外层 双引号,因此我在外部添加了额外的双引号, 所以他们被剥光了衣服。

@echo on
setlocal
设置“DIR\u WORKING=%cd%”
设置“DIR\u RELEASE=%DIR\u WORKING%\RELEASE”
如果不存在“%DIR\u RELEASE%”md“%DIR\u RELEASE%”
对于/F“tokens=1-2 delims=“%%p in('
“%systemroot%\system32\find.exe”?定义TRIALFILE”“%DIR\u WORKING%\Include.wxi”
“)do call:copyfrom%%p%%q
退出/b
:copyfrom
如果不是“%~1”==“定义”退出/b 1
复制/y“%~3”“%DIR\u RELEASE%”
退出/b0
由特殊的xml标记字符分隔,这些字符不是 在文件路径中有效。标记
1-2
将获得缩进 如果没有,则使用
define…=…
或仅使用
define…=…
发现凹痕

使用令牌调用标签
:copyfrom
,将处理 使用cmdline规则的参数。标记中的缩进将 作为空间被忽略<代码>定义应作为参数1 并在标签上测试以验证。之前的xml标记名
=
字符将是参数2。复制的路径将被删除 位于参数3的
=
字符之后

for
循环中的命令有两个以上的双引号 两端都有双引号,因此
cmd
将去掉外层 双引号,因此我在外部添加了额外的双引号, 所以他们被剥光了衣服。

@ECHO OFF
SETLOCAL
设置“sourcedir=U:\sourcedir”
设置“filename1=%sourcedir%\q50264822.txt”
设置“DIR\u WORKING=u:\destdir”
设置“DIR\u RELEASE=%DIR\u WORKING%\RELEASE”
MD“%dir\u release%”2>nul
对于/f“tokens=3delims=
@ECHO OFF
SETLOCAL
设置“sourcedir=U:\sourcedir”
设置“filename1=%sourcedir%\q50264822.txt”
设置“DIR\u WORKING=u:\destdir”
设置“DIR\u RELEASE=%DIR\u WORKING%\RELEASE”
MD“%dir\u release%”2>nul

对于/f“tokens=3delims=,这可能就足够了:

@For/F令牌^=2Delims^=^“%%A In('Find”“?define TRIALFILE“include.wxi”)Do@Copy“%%A”Release 2>Nul

也许这就足够了:

@For/F令牌^=2Delims^=^“%%A In('Find”“?define TRIALFILE“include.wxi”)Do@Copy“%%A”Release 2>Nul

谢谢,这正是我需要的。很好的解释!谢谢,这正是我需要的。很好的解释!