对于批处理文件中的循环读取文件路径的文件

时间:2012-01-20 23:18:37

标签: 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等),并在不同的位置创建一个具有该SAME名称的目录(即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 (
...
)

3 个答案:

答案 0 :(得分:2)

您不希望使用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
  )
)

答案 1 :(得分:1)

我在卸载到SFTP之前将其写入时间戳文件。

希望你觉得它很有用。

时间戳编码似乎与您的问题无关,但我离开了它,因为它是解析文件名本身的一个很好的例子。

我建议你把一个ECHO放在REN命令前面进行测试。不同的贝壳可能会有不同的结果。

最后,delayedexpansion命令是不必要的。这个子例程用循环中的变量修复了我的问题。这可能是因为我的操作系统版本。 (赢8.1) - 离开它不会有任何伤害。

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;

答案 2 :(得分:0)

你有两个小问题:

  • 文件中的路径分隔符为'/',但您在for循环中使用'\'。
  • “results.txt”周围的引号会停止工作。

这很有效。不要在results.txt中写引号,你不会在文件名末尾得到引号。

@echo off
FOR /F "tokens=3,4 delims=/" %%I in (results.txt) DO (
  REM Directory
  echo %%I
  REM File
  echo %%J
)