使用PowerShell/WinSCP脚本实现文件上传后移动功能的技术求助
解决WinSCP SFTP上传后本地文件移动的问题
嘿,我猜你大概率是把WinSCP的远程操作方法和本地文件操作搞混了——WinSCP的Session.MoveFiles是用来操作远程服务器上的文件的,而你要把本地已上传的文件移到另一个文件夹,得用PowerShell原生的Move-Item命令来实现。下面给你调整后的完整脚本,我会把关键步骤标清楚:
修改后的完整代码
# Load WinSCP .NET assembly Add-Type -Path "WinSCPnet.dll" # Set up session options $sessionOptions = New-Object WinSCP.SessionOptions -Property @{ Protocol = [WinSCP.Protocol]::Sftp HostName = "xxxx" UserName = "xxxxx" Password = "xxxx" SshHostKeyFingerprint = "xxxxx" } # 定义本地路径:要上传的源文件夹、上传后要移动到的目标文件夹 $localSourcePath = "xxxxx" # 你原来的PutFiles第一个参数路径 $localDestPath = "D:\Uploaded_Files\" # 替换成你的目标文件夹路径 # 创建目标文件夹(如果不存在的话) if (-not (Test-Path -Path $localDestPath)) { New-Item -ItemType Directory -Path $localDestPath | Out-Null } $session = New-Object WinSCP.Session try { # Connect $session.Open($sessionOptions) # 1. 获取要上传的本地文件列表,避免后续移动错文件 $filesToUpload = Get-ChildItem -Path $localSourcePath # 2. 执行上传操作并检查是否成功 $transferResult = $session.PutFiles($localSourcePath, "xxxxxx*") $transferResult.Check() # 3. 遍历上传成功的文件,移动到目标文件夹 foreach ($transfer in $transferResult.Transfers) { $localFilePath = $transfer.FileName $destFilePath = Join-Path -Path $localDestPath -ChildPath (Split-Path -Path $localFilePath -Leaf) # 移动文件,-Force参数会覆盖目标文件夹中同名文件(可选,根据你的需求调整) Move-Item -Path $localFilePath -Destination $destFilePath -Force Write-Host "已移动文件: $localFilePath -> $destFilePath" } } catch { Write-Host "操作出错: $_" throw } finally { $session.Dispose() }
关键细节说明
- 区分远程/本地操作:WinSCP的
Session类方法都是针对远程服务器的,本地文件操作请用PowerShell原生命令(Move-Item、Get-ChildItem等) - 先获取文件列表:通过
Get-ChildItem提前拿到要上传的文件,确保后续移动的是确实上传成功的文件 - 创建目标文件夹:用
Test-Path和New-Item确保移动目标路径存在,避免报错 - 错误处理:添加
catch块捕获异常,方便排查问题
如果之前你尝试用Session.MoveFiles来移动本地文件,那肯定会失败,因为它的参数是远程路径。现在用上面的脚本,应该就能实现你要的“上传完成后移动本地文件”的功能了。
内容的提问来源于stack exchange,提问作者Jmmitche1984
相关产品推荐
相关产品推荐

