Windows Server 2016下FTP命令输出无法重定向至文件问题
解决Windows Server 2016 FTP脚本添加日志后失效的问题
嘿,我来帮你搞定这个头疼的问题!你遇到的核心问题是把Shell的重定向符号(>/>>)放到了FTP内部命令里——Windows自带的ftp.exe不识别这种Shell语法,导致整个FTP流程执行失败,但批处理里的删除CSV命令不受影响,所以才会出现“日志没生成、文件没上传但被删掉”的情况。
下面是具体的修复步骤和优化方案:
一、先搞懂为什么原来的修改会失败
你之前可能是在FTP脚本(比如ftp_commands.txt)里的命令末尾加了> log.txt,比如:
open ftp.example.com user your_username your_password put file1.csv > log.txt put file2.csv >> log.txt quit
但ftp.exe会把> log.txt当成put命令的一部分(比如把file1.csv > log.txt当成要上传的文件名),自然找不到文件,上传直接失败,日志也根本不会生成。
二、正确的日志记录方式:重定向整个FTP进程的输出
我们需要在批处理调用FTP的那一行,用Shell重定向把整个FTP执行的所有输出(包括成功/错误信息)写到日志里,而不是在FTP内部命令里加符号。
步骤1:恢复你的FTP脚本
把FTP脚本里所有的> log.txt/>> log.txt删掉,恢复成原本能正常运行的命令,比如ftp_commands.txt内容应该是:
open ftp.example.com user your_username your_password binary :: 建议加上,避免二进制文件上传损坏 put *.csv quit
步骤2:修改批处理里的FTP调用行
在批处理中调用FTP时,添加重定向参数:
:: 基础版:追加到固定日志文件 ftp -s:C:\Scripts\ftp_commands.txt >> "C:\FTP_Logs\ftp_upload_log.txt" 2>&1
>>:表示追加内容到日志(如果用>会覆盖旧日志)"路径":用双引号包裹路径,避免路径含空格时出错2>&1:把错误输出(比如连接失败、权限错误)也写到日志里,方便排查问题
步骤3:进阶优化:按小时生成独立日志(可选)
因为你的任务每小时执行一次,建议按时间命名日志,避免覆盖旧日志:
@echo off setlocal enabledelayedexpansion :: 提取当前时间的年月日时分 set "year=%date:~0,4%" set "month=%date:~5,2%" set "day=%date:~8,2%" set "hour=%time:~0,2%" set "minute=%time:~3,2%" :: 处理凌晨小时的前导空格(比如0点显示为" 0",改成"00") if "!hour:~0,1!"==" " set "hour=0!hour:~1!" :: 定义日志文件名 set "logfile=C:\FTP_Logs\ftp_upload_%year%%month%%day%_%hour%%minute%.txt" :: 确保日志目录存在,不存在就创建 if not exist "C:\FTP_Logs\" mkdir "C:\FTP_Logs\" :: 执行FTP上传并记录日志 ftp -s:C:\Scripts\ftp_commands.txt >> "!logfile!" 2>&1 :: 可选:只在FTP上传成功时删除CSV文件(避免上传失败也删文件) if %errorlevel% equ 0 ( del "C:\Your_CSV_Path\*.csv" echo %date% %time% - CSV文件已成功删除 >> "!logfile!" ) else ( echo %date% %time% - FTP上传失败,未删除CSV文件 >> "!logfile!" ) endlocal
三、额外排查点
- 权限问题:计划任务的执行账户(比如系统账户或专用服务账户)必须对日志目录、CSV文件目录、FTP脚本目录有读写权限,否则日志文件创建失败,上传也可能因权限受阻。
- FTP脚本路径:确保
-s:后面的FTP脚本路径是绝对路径,计划任务执行时的工作目录可能和你手动运行时不一样。
内容的提问来源于stack exchange,提问作者Matt Haughton
相关产品推荐
相关产品推荐

