windows 如何在运行“ftp”命令后执行进一步的批处理文件命令包含在批处理文件本身

xt0899hw  于 2022-11-18  发布在  Windows
关注(0)|答案(1)|浏览(162)

我有一个.bat文档,我在那里用FTP做一些操作。我想结束FTP连接,并在所需的目录上完成终端。
我试着这样做,但是当它到达quit时,它就停止了。

cd %USERPROFILE%\Foilder\project\angular
call ng build

@FTP -i -s:"%~f0"&GOTO:EOF
open connection
user
password

cd httpdocs/project

mdelete *.woff

quit

cd %USERPROFILE%\Foilder\Subfolder

它在执行quit后立即给我这个消息,并且从不运行下一行。

221 Goodbye.

理想情况下,运行最后一个cd命令,并在我想要运行它的文件夹中准备好终端。问题是,我必须向两个不同的FTP服务器进行一些上传,如果控制台在我运行“dev.bat”的文件夹中完成,以使其工作,那将是非常棒的
有可能做到这一点吗?

v8wbuo2f

v8wbuo2f1#

您的脚本使用了一个已知的 hack,它允许您直接在批处理文件中指定ftp命令。
%~f0被替换为批处理文件本身的路径。因此ftp -s:%~f0运行ftp并告诉它使用批处理文件本身作为ftp脚本文件。您可能已经注意到这会导致一些错误,因为ftp在批处理文件的前几行失败,这不是有效的ftp命令(第一、第二和第三个)。
同样地,一旦ftp完成,批处理文件将尝试运行ftp ...之后的所有命令,同样失败,因为这些命令不是有效的批处理文件命令。为了避免这种情况,黑客使用GOTO:EOF跳过批处理文件的其余部分(EOF=文件的eof)。
虽然你实际上想在ftp之后执行一些命令。至少是cd命令。所以不要跳过批处理文件的其余部分。只跳过ftp命令:

ftp -i -s:"%~f0"&goto AFTER_FTP
(ftp commands)
quit

:AFTER_FTP
cd %USERPROFILE%\Foilder\Subfolder

请注意@ftp之前。这(以及GOTO:EOF)是一个明显的标志,表明您的批处理文件所基于的脚本在第一行就以ftp开始,除了ftp命令之外,不包含任何其他内容。您已经偏离了这一点。
或者,使用一些功能更强的FTP客户端,允许在其命令行上指定命令,而不会受到攻击。
例如,使用 myWinSCP FTP client,您可以执行以下操作:

cd %USERPROFILE%\Foilder\project\angular
call ng build

winscp.com /ini=nul /command ^
    "open ftp://user:password@connection/" ^
    "cd httpdocs/project" ^
    "rm *.woff" ^
    "exit"

cd %USERPROFILE%\Foilder\Subfolder

有一个guide for converting Windows ftp script to WinSCP script

相关问题