我正在编写一个批处理文件 (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>
这就是我的文件结构:
我试图尽可能地简化问题。我确实尝试了一切方法来解决这个问题,但 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
您需要更改 sourcedir
和 destdir
的设置以适合您的情况。
我使用了一个名为 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/