使用.bat脚本自动执行文件复制

问题描述:

我正在处理测试执行的痕迹。有一个文件(traces/trace.txt),最后一个测试的跟踪存储在那里,我想编写一个脚本来存储这个文件的旧版本。使用.bat脚本自动执行文件复制

这里是我做了什么:

-created一个文件夹

我已经写了一个脚本“trace_archive.bat”关于复制与跟踪文件到这个文件夹和连接文件版本“AllTraces”日期和时间的名称:

set source=c:\some_path\traces\trace.txt 
set destination=c:\somepath\AllTraces\ 
xcopy %source% %destination% /y 
cd %destination% 
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set datetime=%%I 
set datetime=%datetime:~0,8%-%datetime:~8,6% 
ren "trace.txt" "trace_%datetime%.txt" 

所以,在此文件夹中,我将有一个名字像这样的文件:

  • trace_20161117-095910.txt

  • trace_20161117-105713.txt

-created文件夹 “LastTrace”

的想法是存储副本最后一个跟踪版本的跟踪并将trace/trace.txt与它比较。如果有差异,那么现在我们已经执行了新的测试,因此我们启动trace_archive.txt来创建副本,并将LastTrace中的trace.txt替换为当前版本的trace/trace.txt。 所以,我创建了一个脚本“TraceTrigger.bat”:

set noDiff = "FC: no differences encountered" 
FOR /F "tokens=* USEBACKQ" %%F IN (`fc /b C:\some_path\AllTraces\LastTrace\trace.txt c:\some_path\traces\trace.txt`) 
DO (
SET result=%%F 
) 
if NOT %noDiff% == %result% (
c:some_path\scripts\trace_archive.bat 
del /f c:sope_path\AllTraces\LastTrace\trace.txt 
xcopy c:\Users\akomedat\AppData\Local\Temp\.FLT\traces\trace.txt c:Users\akomedat\AllTraces\LastTrace\ 
) 

预期该脚本不起作用。当然,它不会执行trace_archive.bat,也不会将文件复制到discuces。这里是我得到的输出:

C:\some_path\scripts>TraceTrigger.bat 

C:\some_path\scripts>set noDiff = "FC: no differences encountered" 

C:\some_path\scripts>FOR /F "tokens=* USEBACKQ" %F IN (`fc /b C:\some_path\AllTraces\LastTrace\trace.txt c:\some_path\tra 
ces\trace.txt`) DO (SET result=%F) 

C:\some_path\scripts>(SET result=Comparing files C:\some_path\ALLTRACE 
S\LASTTRACE\trace.txt and C:\some_path\TRACES\TRACE 
.TXT) 

C:\some_path\scripts>(SET result=FC: C:\some_path\ALLTRACES\LASTTRACE\ 
trace.txt longer than C:\some_path\TRACE.TXT 
) 
C:\some_path\ALLTRACES\LASTTRACE\trace.txt was unexpected at this time. 

C:\some_path\scripts>if NOT == FC: C:\some_path\ALLTRACES\LASTTRACE\t 
race.txt longer than C:\some_path\TRACES\TRACE.TXT 
(

如何修复TraceTrigger.bat?

总是更好地剪切和粘贴实际代码。手动编辑(some_path/so e_path)可以引发一场疯狂的追逐。

至少有一个问题,你的代码是在这一行:

if NOT %noDiff% == %result% (

由于nodiffresult可以各自包含空格,你需要"quote both sides",即

if NOT "%noDiff%"=="%result%" (

注意,引用原因cmd将每个带引号的字符串看作单个字符串。

但是你的代码太复杂了。

fc /b C:\some_path\AllTraces\LastTrace\trace.txt c:\some_path\traces\trace.txt >nul 
if errorlevel 1 (
    echo files did not match 
    CALL c:some_path\scripts\trace_archive.bat 
    del /f c:sope_path\AllTraces\LastTrace\trace.txt 
    xcopy c:\Users\akomedat\AppData\Local\Temp\.FLT\traces\trace.txt c:Users\akomedat\AllTraces\LastTrace\ 
) else (
    echo files matched 
) 

fcerrorlevel至0上的比赛,1上不匹配。你需要CALL另一个批处理文件 - 如果你只是EXECUTE那批处理,那么处理是转到那个批处理 - 它只会在其他批处理完成时返回,如果你CALL它。