windows - 批处理文件中的 for 循环读取文件路径的文件

标签 windows shell batch-file

我想编写一个 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/

相关文章:

bash - 如果本地文件不存在,则从远程计算机对其进行 scp 并打印消息

linux - 关于 solaris 中的 grep

batch-file - 如何更改通过运行批处理脚本创建的新 cmd 窗口(连同自定义提示)的颜色

batch-file - 使用 putty 和 .bat 文件向串口发送命令

windows - 如何通过 .bat 文件从任务计划程序运行 R 脚本

c - 我想在 UNIX 中制作复制功能文件

windows - 如何制作一个不显示控制台窗口的程序?

windows - 从带有 %~dp0% 的路径复制文件不起作用

c++ - Eclipse-CDT:Windows下Linux交叉编译时的自动路径发现

Windows 中的 Java 和符号链接(symbolic link)