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

How to print only number of files copied as a variable, while logging all the actions?

我正在 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%

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

这是一种方法 来完成您的要求。还有其他方法。这里的秘诀是使用 "for /F" 并将每个结果发送到另一个函数。另一个函数将每一行记录到一个文件中。然后它将查找 xcopy 的 "File(s) copied" 行,如果它看到它,则将其通过管道传递给用户。

另外...请注意 "goto :EOF" 语句。这些告诉批处理解释器 return 给调用者,就像任何其他编程语言一样。

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

:: 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

对复制的文件进行的比较如下所示:

对于包含您的文件名的一行:(此处它们匹配所以它 returns)

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

对于包含您的文件数的一行:(这里他们不匹配是不是 return)

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