我想编写一个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循环似乎停止了:
FOR /F "tokens=1,2,3,4,5,6,7,8,9,10 delims=\" %%G in ("results.txt") DO (
...
)
答案 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)
你有两个小问题:
这很有效。不要在results.txt中写引号,你不会在文件名末尾得到引号。
@echo off
FOR /F "tokens=3,4 delims=/" %%I in (results.txt) DO (
REM Directory
echo %%I
REM File
echo %%J
)