Windows FTP命令行实战:从基础连接到脚本自动化

张开发
2026/4/14 14:46:44 15 分钟阅读

分享文章

Windows FTP命令行实战:从基础连接到脚本自动化
1. Windows FTP命令行入门从零开始建立连接第一次接触FTP命令行时我完全被那一堆黑底白字的命令吓到了。但后来发现Windows自带的ftp.exe其实是个隐藏的宝藏工具特别适合快速传输文件。先说说最基本的连接操作吧。要启动FTP客户端根本不需要安装任何软件。你只需要按下WinR输入cmd打开命令提示符然后输入ftp回车就能看到一个提示符变成ftp的神奇界面。这里有个小技巧如果你直接输入ftp 服务器地址可以跳过中间步骤一步到位。比如我在公司内网备份文件时经常用ftp 192.168.1.100这样的命令直接连接。登录环节最容易出错。输入用户名密码时屏幕上不会显示任何字符连星号*都没有这个设计是为了安全但对新手特别不友好。我建议先在记事本里写好命令然后复制粘贴到命令行。匿名登录的话用户名固定是anonymous密码理论上要填邮箱但实际上随便输几个字母也能通过。连接成功后我强烈建议先用dir命令看看远程目录里有什么。这里有个坑不同操作系统的FTP服务返回的文件列表格式可能不一样。Windows服务器显示的和资源管理器差不多而Linux服务器通常用ls命令风格的简洁列表。如果发现dir不管用可以试试ls -l这个组合在大多数服务器上都有效。2. 文件传输核心操作详解2.1 上传下载的十八般武艺第一次用put命令上传文件时我犯了个低级错误——没切换本地目录。FTP命令行默认的本地工作目录就是你启动cmd时的位置要改变它得用lcd命令。比如lcd D:\我的文档就能切换到D盘。记住这个命令只影响FTP客户端不会改变cmd本身的路径。上传单个文件用put批量上传用mput。但mput有个坑它会逐个文件询问确认。要取消这个烦人的提示得先输入prompt off。我常用的完整流程是这样的lcd D:\备份文件 prompt off mput *.zip下载文件也是类似的get对应单文件mget对应批量。有个实用技巧如果远程文件名有空格要用引号包起来比如get 远程 文件.txt。2.2 目录操作的黑科技除了基本的cd切换目录还有几个特别实用的命令pwd显示远程服务器当前路径比反复cd ..再dir方便多了!dir查看本地目录内容那个感叹号!表示临时退出FTP执行本地命令mkdir/rmdir创建/删除远程目录注意Windows服务器要用rmdir删目录我经常用!开头的命令在FTP和本地之间跳转。比如!explorer .会直接打开本地资源管理器特别适合需要对比本地和远程文件时使用。3. 批处理脚本自动化实战3.1 基础批处理脚本编写第一次听说能用脚本自动登录FTP时我简直发现了新大陆。Windows批处理(.bat)配合FTP命令脚本(.txt)就能实现全自动传输。下面是我用了三年的备份脚本模板先创建一个commands.txtopen ftp.example.com username password lcd D:\每日备份 cd /remote/backup binary prompt off mput *.zip bye然后写个backup.batecho off ftp -n -s:commands.txt log.txt 21这个-n参数禁止自动登录避免和脚本里的账号冲突。最后的 log.txt会把所有输出重定向到日志文件方便排查问题。3.2 PowerShell高级玩法批处理脚本虽然简单但功能有限。后来我转向PowerShell发现System.Net.FtpWebRequest类简直强大到爆。这里分享一个支持断点续传的上传脚本$ftpRequest [System.Net.FtpWebRequest]::Create(ftp://example.com/file.zip) $ftpRequest.Method [System.Net.WebRequestMethodsFtp]::UploadFile $ftpRequest.Credentials New-Object System.Net.NetworkCredential(user,pass) $ftpRequest.UseBinary $true $ftpRequest.UsePassive $true $fileStream [System.IO.File]::OpenRead(C:\local\file.zip) $ftpStream $ftpRequest.GetRequestStream() $buffer New-Object byte[] 10240 while (($read $fileStream.Read($buffer, 0, $buffer.Length)) -gt 0) { $ftpStream.Write($buffer, 0, $read) Write-Progress -Activity 上传中... -Status $($fileStream.Position/1MB) MB已上传 } $ftpStream.Dispose() $fileStream.Dispose()这个脚本不仅能显示实时进度条还因为UsePassive$true能穿透大多数防火墙。我后来给它加上了错误重试机制现在每周自动备份数据库都用它。4. 实战问题排查与优化4.1 防火墙与连接问题被动模式(PASV)是我解决防火墙问题的终极武器。在普通模式下FTP服务器会主动连接客户端传输数据这会被大多数防火墙拦截。而被动模式下所有连接都由客户端发起。启用方法很简单连接时加-p参数ftp -p ftp.example.com或者在连接后输入quote PASV如果还是连不上试试-v参数开启详细日志ftp -v -d ftp.example.com这个组合会显示完整的FTP协议交互过程我靠它解决了90%的连接问题。4.2 编码与性能优化传输中文文件名乱码是老问题了。现代FTP服务器基本都支持UTF-8连接后先输入quote OPTS UTF8 ON如果服务器不支持那就只能忍痛用拼音命名文件了。大文件传输时一定要记得用binary模式binary否则文本文件会被自动转换换行符二进制文件(如zip)肯定会损坏。我有个同事曾经因为忘记这个命令导致整个项目组的代码备份全部无法解压那场面简直惨烈。传输速度慢的话可以试试调整TCP窗口大小。虽然ftp.exe本身不支持但可以用以下命令优化系统全局设置netsh interface tcp set global autotuninglevelrestricted这个设置对千兆内网传输大文件特别有效我的测试显示速度能提升30%左右。

更多文章