使用两个txt文件复制和重命名文件

时间:2018-05-18 14:42:17

标签: batch-file copy

我对批处理脚本并不熟悉,所以我非常感谢这里的一些帮助! 我一直在尝试使用两个txt文件复制和重命名一堆文件。 chart_list.txt文件将具有原始名称。

chart_list.txt
Chart_A1_86_88.png
Chart_A2_86_88.png
Chart_B1_86_88.png
Chart_B2_86_88.png

newchart_list.txt文件将具有目标名称。

newchart_list.txt
Chart_A1.png
Chart_A2.png
Chart_B1.png
Chart_B2.png

查看以下帖子(Copy a list (txt) of files和{{3}}),我想出了以下内容:

setlocal enableextensions enabledelayedexpansion
@echo off

set src_folder=C:\Source
set dst_folder=C:\Destination
set flag=0
for /f "tokens=*" %%i in (chart_list.txt) DO (
set /A flag+=1
echo !flag!
set flag2=0
    for /f "tokens=*" %%j in (newchart_list.txt) DO (
        set /A flag2+=1
        echo !flag2!
        if !flag! == !flag2! (
        copy "%src_folder%\%%i" "%dst_folder%\%%j" /Y
        )
    )
)
@pause

目的是让图表列表第一行和newchart_list中的名称匹配。 但是,当我执行命令时没有任何反应。 cmd窗口显示

1
0
0
0
0
2
0
0
0
0
3
0
0
0
0
4
0
0
0
0

(我添加了echo命令来查看flag和flag2是否实际发生了变化,但似乎并非如此,因为flag2仍然设置为0)。

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

这是一种方法:

 PeriodicWorkRequest.Builder myWorkBuilder =
                new PeriodicWorkRequest.Builder(MyWorker.class, 24,
                        TimeUnit.HOURS);

        PeriodicWorkRequest myWork = myWorkBuilder.build();
        WorkManager.getInstance().enqueue(myWork);

只需使用您的特定数据填写行@Echo Off SetLocal DisableDelayedExpansion Set "fileOld=chart_list.txt" Set "fileNew=newchart_list.txt" Set "dirSrce=C:\Source" Set "dirDest=C:\Destination" (For /F "UseBackQ Tokens=*" %%A In ("%fileOld%") Do (Set /P "B="<&3 SetLocal EnableDelayedExpansion Echo(Copy /Y "%dirSrce%\%%A" "%dirDest%\!B!" EndLocal)) 3<"%fileNew%" Pause - 3上的变量(不要在目录路径中添加尾随反斜杠,也不要包含双引号或删除当前存在的那些)

如果您对输出感到满意,可以从第6行删除Echo(并删除最后一行,以实际执行10程序。

该脚本不会检查这些变量是否有效,是否存在,是否有匹配的行数等。我会留给您根据需要进行处理

修改

这是一种替代方法,更符合原作(但使用Copy命令)

Find

...并且没有标记或需要延迟扩展,(与Aacini的方法相同,但使用@Echo Off Setlocal EnableExtensions EnableDelayedExpansion Set "src_folder=C:\Source" Set "dst_folder=C:\Destination" Set "flag=0" For /F "UseBackQ Tokens=*" %%A In ("chart_list.txt") Do ( Set /A flag+=1 For /F "Tokens=1* Delims=]" %%B In (' "Find /N /V ""<"newchart_list.txt"|Find "[!flag!]""' ) Do Copy /Y "%src_folder%\%%A" "%dst_folder%\%%C") 代替Find

FindStr

答案 1 :(得分:1)

更简单,但效率不高:

@echo off
setlocal

set src_folder=C:\Source
set dst_folder=C:\Destination

for /f "tokens=1* delims=:" %%i in ('findstr /N "^" chart_list.txt') DO (
    for /f "tokens=1* delims=:" %%x in ('findstr /N "^" newchart_list.txt') DO (
        if %%i == %%x (
            copy "%src_folder%\%%j" "%dst_folder%\%%y" /Y
        )
    )
)
pause

如果要处理的文件很大,最好使用其他任何建议的其他方法。见this comment