使用 .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"
因此,在此文件夹中,我将拥有名称如下的文件:
trace_20161117-095910.txt
trace_20161117-105713.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% (
由于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
该批处理,则处理 转移 到该批处理 - 它只会 return 当另一批完成时,如果你 CALL
它。
我正在处理测试执行的痕迹。有一个文件 (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"
因此,在此文件夹中,我将拥有名称如下的文件:
trace_20161117-095910.txt
trace_20161117-105713.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% (
由于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
该批处理,则处理 转移 到该批处理 - 它只会 return 当另一批完成时,如果你 CALL
它。