使用PowerShell通过Rename-FTPItem移动FTP文件报(550)文件不可用错误咨询
550错误核心原因
- 第一类必现错误:路径拼接缺失目录分隔符
你定义的$ServerPath、$archivefolder两个目录变量末尾没有加/分隔符,直接拼接文件名后会生成无效路径:
比如原文件真实路径是ftp://myftpserver.com/Test/20240520_sales.csv,但你拼出来的原文件路径是ftp://myftpserver.com/Test20240520_sales.csv,完全匹配不到服务器上的真实文件,因此FTP返回550文件不存在错误。 - 第二类参数逻辑不匹配:PSFTP的
Rename-FTPItem不支持传入带域名前缀的完整FTP URL作为目标路径
该cmdlet本质是封装了FTP原生的重命名指令(FTP本身没有独立的移动命令,跨目录移动等价于将文件重命名到目标目录路径),传入的路径参数仅支持使用相对于FTP会话根目录的相对路径,如果你重复拼接域名前缀,会被模块识别为服务器上的嵌套路径,同样触发550错误。
修正后可直接运行的代码
$FtpServer = "ftp://myftpserver.com" $User = "myusername" $PWD = "mypassword" $Password = ConvertTo-SecureString $PWD -AsPlainText -Force $FtpCredentials = New-Object System.Management.Automation.PSCredential ($User, $Password) Set-FTPConnection -Credentials $FtpCredentials -Server $FtpServer -Session MyFtpSession -UsePassive $FtpSession = Get-FTPConnection -Session MyFtpSession # 定义目录路径时补充末尾的/分隔符,使用相对根目录的路径格式 $ServerPath = "/Test" $archivefolder = "/Tested" # 匹配所有csv格式的待处理文件 $fileList = Get-FTPChildItem -Session $FtpSession -Path $ServerPath -Filter *.csv foreach ($element in $fileList) { # 直接使用文件对象自带的FullName属性获取原文件路径,避免手动拼接出错 $sourcePath = $element.FullName # 拼接目标文件路径,目录末尾保留/分隔符 $targetPath = $archivefolder + $element.Name # 传入相对路径执行重命名(即跨目录移动操作) Rename-FTPItem -Path $sourcePath -NewName $targetPath -Session $FtpSession }
关于通配符批量移动的说明
Rename-FTPItem本身不支持直接传入通配符执行批量操作,但通过上述代码的逻辑,可以先通过Get-FTPChildItem的-Filter参数匹配所有带时间戳的csv文件,再循环执行移动操作,完全可以满足你的归档需求。如果调整代码后仍然出现550错误,需要检查当前FTP用户对Test、Tested目录是否同时拥有读取、写入、修改权限。
内容的提问来源于stack exchange,提问作者SQ-what
相关产品推荐
相关产品推荐

