Как напечатать только количество файлов, скопированных как переменную, при регистрации всех действий? - PullRequest
0 голосов
/ 08 мая 2019

Я пишу сценарий для 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 Ответ

1 голос
/ 08 мая 2019

Вот в одну сторону , чтобы выполнить то, что вы просите.Есть и другие способы.Секрет здесь заключается в использовании «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
...