使用.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% (
由于nodiff
和result
可以各自包含空格,你需要"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
)
fc
套errorlevel
至0上的比赛,1上不匹配。你需要CALL
另一个批处理文件 - 如果你只是EXECUTE
那批处理,那么处理是转到那个批处理 - 它只会在其他批处理完成时返回,如果你CALL
它。