Архивирование файлов с помощью 7-zip, загрузка на FTP-сервер только текущих файлов даты, а затем удаление - PullRequest
0 голосов
/ 15 января 2019

В одном скрипте у меня есть несколько шагов:

  • Архивирование файлов с помощью 7-zip, сжатие, шифрование, удаление исходного файла после архивации

  • Затем я передаю на сервер FTP файлы с шага 1.

  • Затем я удаляю старые файлы из шага 1.

Мой сценарий:

REM 7-zip archiving, compress, encryption, delete source file

@echo off
set source="D:\test"
set destination="D:\test"
set passwd="Qwerty"
set dd=%DATE:~0,2%
set mm=%DATE:~3,2%
set yyyy=%DATE:~6%
set hh=%TIME:~0,2%
set mm=%TIME:~3,2%
set ss=%TIME:~6,2%
set curdate=%dd%-%mm%-%yyyy%-%hh%-%mm%-%ss%
"C:\Program Files\7-Zip\7z.exe" a -ssw -mx9 -xr!*.7z -p%passwd% %destination%\backup_%curdate%.7z %source% -sdel

REM Send to FTP server by cmd ftp

set ftp_host=127.0.0.1
set ftp_username=test
set ftp_pass=test
set file_transport=transport.txt
set file_name="*.7z"
set dir_from=D:\test
set dir_to=/
echo open %ftp_host%>%file_transport%
echo user %ftp_username% %ftp_pass%>>%file_transport%
echo cd %dir_to%>>%file_transport%
echo lcd %dir_from%>>%file_transport%
echo put %file_name%>>%file_transport%
echo bye>>%file_transport%
ftp -v -n -s:%file_transport%
del %file_transport%

REM delete old files older than N days
forfiles /p "D:\test" /d -30 /m *.7z /c "cmd /c del @file"

Итак, проблема в следующем:

Когда я пытаюсь отправить на ftp-сервер, я не знаю, как отправлять только файлы %.7z% в текущий день. Даже если я использую file_name="*.7z", он работает только для первого архива из каталога dir_from=D:\test, но если у меня есть это значение, он должен отправлять все из D:\test. Я пытался использовать ncFTP для этой задачи, но я не могу понять, как это работает, это не работает:

"C:\Program Files (x86)\NcFTP Software\NcFTPncftpput.exe" -u "test" -p "test" "127.0.0.1"  "/" "D:\test"

1 Ответ

0 голосов
/ 16 января 2019
@echo off
setlocal

set "source=D:\test"
set "destination=D:\test"
set "dirs="." "fullbackup" "diffbackup""
set "passwd=Qwerty"
set "dd=%DATE:~0,2%"
set "mm=%DATE:~3,2%"
set "yyyy=%DATE:~6%"
set "hh=%TIME:~0,2%"
set "mn=%TIME:~3,2%"
set "ss=%TIME:~6,2%"
set "curdate=%dd%-%mm%-%yyyy%-%hh%-%mn%-%ss%"
set "logfile=%cd%\log.tmp"

REM Make the logfile if not exist.
if not exist "%logfile%" 1> nul 2> "%logfile%" echo.

REM Make ftp file.
set "ftp_host=127.0.0.1"
set "ftp_username=test"
set "ftp_pass=test"
set "file_transport=transport.txt"
set "ftp_root=/"

(
    echo open %ftp_host%
    echo user %ftp_username% %ftp_pass%
    echo binary
) > "%file_transport%"

REM Zip files.
set "zipped=0"

for %%A in (%dirs%) do if exist "%source%\%%~A" (
    set "setdir="

    for %%B in ("%source%\%%~A\*") do if /i not "%%~xB" == ".7z" (
        "C:\Program Files\7-Zip\7z.exe" a -ssw -mx9 -p"%passwd%" "%destination%\%%~A\%%~nxB_%curdate%.7z" "%%~fB" -sdel

        if not errorlevel 1 (
            set /a "zipped+=1"
            >> "%logfile%" echo zip "%%~A\%%~nxB_%curdate%.7z".

            if not defined setdir (
                set "setdir=1"
                if not "%%~A" == "." echo mkdir "%ftp_root%/%%~A"
                echo cd "%ftp_root%/%%~A"
                echo lcd "%destination%\%%~A"
            )

            echo put "%%~nxB_%curdate%.7z"
        ) >> "%file_transport%"
    )
)

>> "%file_transport%" echo bye

REM Send to FTP server by cmd ftp.
if %zipped% equ 0 (
    >> "%logfile%" echo zip no files for "%curdate%".
) else (
    ftp -v -n -i -s:"%file_transport%"

    if errorlevel 1 (
        >> "%logfile%" echo ftp error %errorlevel%.
    ) else >> "%logfile%" echo ftp success.
)

del "%file_transport%"

REM Delete old files older than N days.
for %%A in (%dirs%) do if exist "%destination%\%%~A\*.7z" (
    pushd "%destination%\%%~A" && (
        echo CD: "%destination%\%%~A"
        forfiles /d -30 /m *.7z /c "cmd /c del @file"
        popd
    )
)

REM Email the log content.
if not exist "%logfile%" exit /b 0

set command=^&{$usr= 'mylogon';^
$pwd= ConvertTo-SecureString -String 'mypassword' -AsPlainText -Force;^
$cred= New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $usr, $pwd;^
$body= Get-Content -LiteralPath '%logfile%' -Raw;^
Send-MailMessage -To 'mymail' -From 'mymail' -Subject 'Log' -SmtpServer 'smtp.mail.ru' -Port 587 -Credential $cred -UseSSL -Body $body}

Powershell -Command "%command%"

REM Merge or rename .tmp file to .txt file.
for %%A in ("%logfile%") do (
    if "%%~xA" == ".tmp" (
        if exist "%%~nA.txt" (
            type "%%~A" >> "%%~nA.txt"
            del "%%~A"
        ) else ren "%%~A" "%%~nA.txt"
    )
)

exit /b 0

Выдача даты и времени, когда вы используете mm для месяца и mm для минут. Теперь используйте mn для минут для разделения значений.

Все файлы, кроме файлов .7z, будут индивидуально заархивированы и доступны для ftp.

zipped переменная хранит количество файлов, сжатых так, команда ftp запускается, только если значение zipped больше 0.

transport.txt будет вставлено содержимое несколько раз, вместо того, чтобы все сразу. Это делается так, каждый каталог и файл может быть обработан отдельно.

Циклы for теперь могут выполнять итерацию списка каталогов для архивирования *.7z файлов. Команды ftp put будут отображаться в transport.txt с каждым файлом Молнии.

Упрощенная запись в файл %file_transport%. Вставлено mkdir по мере необходимости чтобы убедиться, что удаленный каталог создан до появления cd.

forfiles теперь используется в каждом каталоге, указанном в переменной dirs.

Переменная dirs содержит список имен каталогов, через которые необходимо выполнить итерацию. . - это текущий каталог, т. Е. Корень source пути.

powershell отправит текстовое содержимое logfile по электронной почте с командлет Send-MailMessage . Оно не будет отправлено, если переменная logfile path не существует.

Если расширение файла журнала .tmp, оно будет переименовано с расширением .txt, если не существует, в противном случае будет объединен с Файл .txt и файл .tmp будут удалены. Это делается в конце сценария. Использование расширения .tmp позволяет powershell отправлять содержимое по электронной почте файл .tmp вместо файла большего размера .txt.

...