我想编写一个 Windows 批处理文件脚本,它将循环遍历文件路径的文本文件,使用每个文件路径中的数据执行一些工作,然后最终删除该文件。
我首先运行 FORFILES 命令并发送其输出(@PATH 参数是它匹配的任何文件的完整路径)到文本文件 (results.txt)。
我最终得到一个如下所示的 results.txt 文件:
"C:/Windows/Dir1/fileA.log"
"C:/Windows/Dir1/fileA.log"
"C:/Windows/Dir2/fileC.log"
"C:/Windows/Dir3/fileB.log"
我想做的是:
- 使用 FOR 循环并读取 results.txt 文件中的每一行
- 对于每一行(文件路径),删除日志文件所在的目录名称(即:Dir1、Dir2 等),并在不同位置创建具有相同名称的目录(即 D :/Archive/Backups/Dir1、D:/Archive/Backups/Dir2 等..) -- 假设该目录不存在。
- 将实际的 .log 文件移至该目录中的 zip 文件中 [我有执行此操作的代码]。
- 从原始位置删除 .log 文件。 [非常简单]
我无法找出完成前两个步骤的最佳方法。我的 FOR 循环在阅读第一行后似乎停止了:
FOR /F "tokens=1,2,3,4,5,6,7,8,9,10 delims=\" %%G in ("results.txt") DO (
...
)
最佳答案
您不想使用 tokens/delims 选项解析路径,因为您不知道正在处理多少目录级别。您想要完整地保留每一行。要解析要使用 FOR 变量修饰符的路径。 (从命令行输入 HELP FOR 并查看输出的最后一部分)
%%~pG 给出路径(不带驱动器或文件名)。如果我们去掉最后一个 \
,我们可以通过另一个 FOR 迭代并使用 %%~nxA 获取文件目录的名称(和可能的扩展名)。
延迟扩展的切换只是为了防止路径中可能出现 !
。如果您知道没有路径包含 !
那么您只需在脚本顶部启用延迟扩展即可完成。
编辑 - 自从 Aacini 指出我误读了需求以来,此代码已进行了重大修改。现在应该满足要求了。
for /f "usebackq delims=" %%G in ("results.txt") do (
set "myPath=%~pG"
setlocal enableDelayedExpansion
for /f "eol=: delims=" %%A in ("!myPath:~0,-1!") do (
endlocal
if not exist d:\Archive\Backups\%%~nxA md d:\Archive\Backups\%%~nxA
rem ::zip %%G into zip file in the D: location
rem ::you should be able to create the zip with the move option
rem ::so you don't have to del the file
)
)
关于windows - 批处理文件中的 for 循环读取文件路径的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8949090/