Batch file 在命令行(.bat)中通过ftp发送zip文件后,该文件已损坏

Batch file 在命令行(.bat)中通过ftp发送zip文件后,该文件已损坏,batch-file,command-line,ftp,zip,Batch File,Command Line,Ftp,Zip,我正在制作一个bat文件来压缩一个文件,然后通过ftp发送,一切正常,但发送到ftp后的文件有时会损坏,特别是当其较大且加密时,本地zip文件可以。我在网上查了一下,它说传输模式可能有问题,但我把它设为二进制,同样有问题 @echo off REM time format hhssmm set hour=%time:~0,2% if "%hour:~0,1%" == " " set hour=0%hour:~1,1% REM echo hour=%hour% set min=%time:~3

我正在制作一个bat文件来压缩一个文件,然后通过ftp发送,一切正常,但发送到ftp后的文件有时会损坏,特别是当其较大且加密时,本地zip文件可以。我在网上查了一下,它说传输模式可能有问题,但我把它设为二进制,同样有问题

@echo off

REM time format hhssmm

set hour=%time:~0,2%
if "%hour:~0,1%" == " " set hour=0%hour:~1,1%
REM echo hour=%hour%
set min=%time:~3,2%
if "%min:~0,1%" == " " set min=0%min:~1,1%
REM echo min=%min%
set secs=%time:~6,2%
if "%secs:~0,1%" == " " set secs=0%secs:~1,1%
REM echo secs=%secs%

REM date format yyyymmdd
set year=%date:~0,4%
REM echo year=%year%
set month=%date:~5,2%
if "%month:~0,1%" == " " set month=0%month:~1,1%
REM echo month=%month%
set day=%date:~8,2%
if "%day:~0,1%" == " " set day=0%day:~1,1%
REM echo day=%day%

set pass="password"
Start 7za.exe a file_%year%%month%%day%_%hour%%min%%secs%.zip * -r -mx9 -p%pass% -mhe

set "file=file_%year%%month%%day%_%hour%%min%%secs%.zip"
REM set username = all
REM set userpass = 12345

echo debug> ftpcmd.dat
echo user all> ftpcmd.dat
echo 12345>> ftpcmd.dat
echo binary>> ftpcmd.dat
status
echo put %file%>> ftpcmd.dat
echo quit>> ftpcmd.dat

ftp -n -s:ftpcmd.dat xx.xxx.xxx.xx
del ftpcmd.dat
pause
我使用的是7-Zip命令行可执行文件7za.exe。压缩文件。 这就是结果:

status
Connected to xx.xxx.xxx.xx.
220-FileZilla Server version 0.9.43 beta
220-written by Tim Kosse (tim.kosse@filezilla-project.org)
220 Please visit http://sourceforge.net/projects/filezilla/
ftp> debug
Debugging On .
ftp> user all
---> USER all
331 Password required for all

---> PASS 12345
230 Logged on
ftp> binary
---> TYPE I
200 Type set to I
ftp> put file_20140205_093700.zip
---> PORT xx,xxx,xxx,xx,xx,x
200 Port command successful
---> STOR file_20140205_093700.zip
150 Opening data channel for file upload to server of "/file_20140205_093700.zip"
226 Successfully transferred "/file_20140205_093700.zip"
ftp: 179312 bytes sent in 0,00Seconds 179312000,00Kbytes/sec.
ftp> quit
---> QUIT
221 Goodbye
Press any key to continue . . .

谢谢你的回答。我发现了问题。文件发送到ftp时,
7za.exe
仍在压缩,只需在启动exe后添加START/WAIT即可:

START /WAIT 7za.exe a file_%year%%month%%day%_%hour%%min%%secs%.zip * -r -mx9 -p%pass% -mhe
下面是经过一些改进后的hole脚本。它使zip文件受密码保护,并通过ftp发送。您可以在命令窗口中设置参数或将其保存在脚本中

您只需要在同一文件夹中使用7zip命令行(7za.exe)

@ECHO off

REM time format hhssmm
SET hour=%time:~0,2%
IF "%hour:~0,1%" == " " SET hour=0%hour:~1,1%
REM ECHO hour=%hour%
SET min=%time:~3,2%
IF "%min:~0,1%" == " " SET min=0%min:~1,1%
REM ECHO min=%min%
SET secs=%time:~6,2%
IF "%secs:~0,1%" == " " SET secs=0%secs:~1,1%
REM ECHO secs=%secs%

REM date format yyyymmdd (Adjust to local date format)
SET year=%date:~0,4%
REM ECHO year=%year%
SET month=%date:~5,2%
IF "%month:~0,1%" == " " SET month=0%month:~1,1%
REM ECHO month=%month%
SET day=%date:~8,2%
IF "%day:~0,1%" == " " SET day=0%day:~1,1%
REM ECHO day=%day%

REM set filename with current timestamp
SET filename=file_%year%%month%%day%_%hour%%min%%secs%.zip

REM to ask to set zip password
SET /p zippass=Set zip password:

REM to set the zip password instead of asking for it
REM SET zippass="p"

REM to ask for parameters
SET /p ftphost=Enter ftphost:
SET /p username=Enter user:
SET /p userpass=Enter password:

REM to save the parameters instead of asking for them
REM SET ftphost=xx.xxx.xxx.xx
REM SET username=all
REM SET userpass=12345

SET encrypt_headers=
REM SET encrypt_headers=-mhe

START /wait 7za.exe a %filename% * -r -mx9 -p%zippass% %encrypt_headers% -x!7za.exe -x!zip_ftp.bat -x!zip_ftp_ask.bat
SET file=%filename%

@ECHO off
ECHO user %username%> ftpcmd.dat
ECHO %userpass%>> ftpcmd.dat
ECHO bin>> ftpcmd.dat
ECHO put %file%>> ftpcmd.dat
ECHO quit>> ftpcmd.dat

ftp -n -s:ftpcmd.dat %ftphost%
DEL ftpcmd.dat
PAUSE

您能否将ftpcmd.dat
debug
作为第一行添加到put语句
status
之前,并让我们知道您的文件在本地也是179312字节?如何确定文件已损坏?是否执行GET?这可能也是ftp软件的问题。尝试查阅软件提供的帮助文档。我现在明白了。当它被破坏时,ftp文件夹中的大小不同,我得到了这个错误“存档文件的格式未知或已损坏”,但不知道为什么有时它会工作。执行GET是什么意思?谢谢你的回答,我发现了问题。当文件被发送到ftp时,7za.exe仍在压缩,只需在启动exe后添加START/WAIT即可