在记录所有操作时,如何仅打印作为变量复制的文件数量?

时间:2019-05-08 12:53:02

标签: batch-file logging xcopy

我正在BAT文件上编写脚本,以在必要时使用,以在多台计算机上备份应用程序的文件夹。

此脚本可在Windows 7上运行:它也可在Windows 10上运行吗?

:: Backup script with logging
@echo off

net use \\SERVER\Shared_Folder userPassword /USER:userName

set PATH=c:\WINDOWS\system32;
set SRC="C:\Program Files (x86)\ApplicationName\TargetFolder"
set DST=\\SERVER\Shared_Folder\Backups
set LOG=%DST%\Backup_LogFile.log

echo:>>%LOG%
echo Backup from computer %COMPUTERNAME% >>%LOG%
echo Starts -- %DATE% %TIME% >>%LOG%
echo Wait please: backup is running...

xcopy %SRC% %DST%\%COMPUTERNAME%\ /A /D /E /J /Y /Z>>%LOG%

echo Ends -- %DATE% %TIME% >>%LOG%
echo:>>%LOG%

我的脚本工作正常,但我希望用户在终端上比执行脚本更好的响应。 该脚本可以在日志文件上正确添加操作,但是我希望用户只能看到复制的文件数,而不是复制的所有文件的列表。

1 个答案:

答案 0 :(得分:1)

这是一种方法,可以完成您的要求。还有其他方法。这里的秘密是使用“ for / F”,并将每个结果发送到另一个函数。另一个功能将每行记录到一个文件中。然后,它将查找xcopy的“复制的文件”行,并将其通过管道传递给用户。

也...请注意“ goto:EOF”语句。这些命令使批处理解释器像其他任何编程语言一样, 返回 给调用者。

我希望这能满足您的要求。 :)

:: Backup script with logging
@echo off

net use \\SERVER\Shared_Folder userPassword /USER:userName

set SRC="C:\Program Files (x86)\ApplicationName\TargetFolder"
set DST=\\SERVER\Shared_Folder\Backups
set LOG=%DST%\Backup_LogFile.log

echo:>>%LOG%
echo Backup from computer %COMPUTERNAME% >>%LOG%
echo Starts -- %DATE% %TIME% >>%LOG%
echo Wait please: backup is running...

for /f "delims=" %%f in ('xcopy %SRC% %DST%\%COMPUTERNAME%\ /A /D /E /J /Y /Z') do call :log_items "%%f"
echo Ends -- %DATE% %TIME% >>%LOG%
echo:>>%LOG%

goto :EOF

:log_items
Set InputLine=%~1

:: Log everything
echo %InputLine%>>%LOG%

:: Check if the line coming in contains "File(s) copied" if it doesn't, return
if "%InputLine:File(s) copied=%"=="%InputLine%" goto :EOF

:: If it does, show it to the user and return
echo %InputLine%
goto :EOF

对复制的文件所做的比较如下:

对于带有您文件名的行:(此处匹配,因此返回)

C:\git\ps>if "test\targetver.h" == "test\targetver.h" goto :EOF

对于包含您文件数量的行:(此处不匹配,不会返回)

C:\git\ps>if "205 " == "205 File(s) copied" goto :EOF