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

时间:2016-11-17 11:55:21

标签: batch-file command-prompt

我正在处理测试执行的痕迹。有一个文件(traces / trace.txt),其中存储了最后一个测试的跟踪,我想编写一个脚本来存储该文件的旧版本。

这就是我所做的:

- 为文件版本创建了一个文件夹“Certces”

我写了一个脚本“trace_archive.bat”,用于将带有跟踪的文件复制到该文件夹​​,并将日期和时间连接到名称:

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

- 创建了一个文件夹“LastTrace”

这个想法是在那里存储跟踪的最后版本的副本,并将traces / trace.txt与它进行比较。如果存在差异,那么我们现在执行新测试,因此我们启动trace_archive.txt以复制到7.7,并使用当前版本的trace / trace.txt替换LastTrace中的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,也不会将文件复制到Certces。这是我得到的输出:

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?

1 个答案:

答案 0 :(得分:1)

始终更好地剪切并粘贴实际代码。手动编辑(some_path / so p 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
 )

fc在匹配时将errorlevel设置为0,在不匹配时设置为1。您需要CALL其他批处理文件 - 如果您只是EXECUTE该批处理,则处理转移到该批处理 - 它只会在另一批处理完成时返回你CALL它。