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

Using .bat scripts to automate file copying

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

这是我所做的:

- 为文件版本 "AllTraces"

创建了一个文件夹

我写了一个脚本 "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"

因此,在此文件夹中,我将拥有名称如下的文件:

- 创建文件夹 "LastTrace"

我们的想法是在此处存储上一版跟踪的副本,并将 traces/trace.txt 与其进行比较。如果有差异,那么我们现在执行了新测试,因此我们启动 trace_archive.txt 以复制到 AllTraces 并将 LastTrace 中的 trace.txt 替换为当前版本的 traces/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 并且不会将文件复制到 AllTraces。这是我得到的输出:

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/sope_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 该批处理,则处理 转移 到该批处理 - 它只会 return 当另一批完成时,如果你 CALL 它。