batch-file - 批处理文件解析 XML 文件并将文件复制到不同的文件夹

标签 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

   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>

这就是我的文件结构:

File structure

我试图尽可能地简化问题。我确实尝试了一切方法来解决这个问题,但 CMD 总是给我最模糊的错误。我似乎不知道如何让嵌套的 for 循环工作。请帮忙

最佳答案

@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

您需要更改 sourcedirdestdir 的设置以适合您的情况。

我使用了一个名为 q50264822.txt 的文件来进行测试,其中包含 include.wxi 中的数据。

所需的 COPY 命令仅出于测试目的而进行 ECHO 编辑。 验证命令正确后,将 ECHO(COPY 更改为 COPY 以实际复制文件。附加 >nul 抑制报告消息(例如已复制 1 个文件)

您的问题的根本在于您没有调用延迟扩展的设施(SO/batch 上的#1常见问题解答 - 使用搜索设施来查找许多很多示例)当您更改代码块(带括号的一系列命令)中的变量值时

另一个复杂的问题是你对兔子耳朵的使用。 SO 的标准做法是使用语法 set "var=value" 进行字符串赋值,因为这可以确保忽略行上的杂散尾随空格。 SO 的标准做法是不为分配引号,因为这会在连接变量时适当删除不需要的引号时产生问题。

因此 - 建立变量后,创建目标目录(否则 copy 命令将创建一个文件)并使用 2>nul 抑制目标中的错误消息已经存在。

然后使用适当的分隔符从文件中读取适当的行 o 选择所需的文件名作为标记 3%%a - 记住它将被引用。

调用副本将首先使用~%%a中删除引号,然后引用并评估结果,替换 %dir_working%。评估是在子 shell 中执行的,因此不需要延迟扩展

关于batch-file - 批处理文件解析 XML 文件并将文件复制到不同的文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50264822/

相关文章:

windows - 检查远程主机上某个端口的状态

windows - 不用 tty 访问 COIN$

python - QProcess 无法写入 cmd.exe

batch-file - 删除文件夹内容但不删除文件夹

java - 使用批处理运行 Java + 库

windows - 有没有一种方法可以使用 Windows 命令获取日期和时间而不使用日月年等分隔符?

browser - 使用命令提示符打开网站并输入用户名和密码

windows - 子驱动器和文件夹

windows - 从 Windows 批处理变量中获取子字符串

batch-file - 绕过 Windows 批处理文件中字符串的 1024 个字符限制