文件归档与7-ZIP,上传到FTP服务器仅当前日期的文件,然后删除

问题描述 投票:1回答:1

在一个脚本中,我有以下几个步骤:

  • 归档文件由7-ZIP,压缩,加密,压缩后删除源文件
  • 然后我转移到从步骤1 FTP服务器的文件。
  • 然后,我从第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"
windows batch-file cmd ftp archiving
1个回答
1
投票
@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路径不存在它不会发送。

如果日志文件的扩展名是.tmp,就会将扩展.txt更名如果不存在,否则将被合并到.txt文件和.tmp文件将被删除。这是在脚本结束时进行。使用扩展.tmp允许powershell电子邮件,而不是更大的.tmp文件中.txt文件中的内容。

© www.soinside.com 2019 - 2024. All rights reserved.