如何在PowerShell中通过WinSCP .NET组件显示单文件下载完成提示
实现单个FTP文件下载完成时实时提示
你的脚本当前是在所有文件下载完成后,通过遍历$transferResult.Transfers输出提示,所以只能在全部任务结束后看到结果。要实现每个文件下载完成就立刻显示提示,需要利用WinSCP的FileTransferred事件,它会在单个文件传输完成时触发。
修改后的脚本如下:
Add-Type -Path "C:\Program Files (x86)\WinSCP\WinSCPnet.dll" $sessionOptions = New-Object WinSCP.SessionOptions -Property @{ Protocol = [WinSCP.Protocol]::Ftp HostName = "ip of ftp" PortNumber = port number UserName = "user" Password = "credentials" } $session = New-Object WinSCP.Session try { # 注册文件传输完成事件,单个文件下载完就触发 $session.add_FileTransferred({ param($sender, $e) # 检查传输是否成功 if ($e.Error -eq $null) { Write-Host ("文件 {0} 下载完成" -f $e.FileName) } else { Write-Host ("文件 {0} 下载失败: {1}" -f $e.FileName, $e.Error.Message) } }) $session.Open($sessionOptions) $transferOptions = New-Object WinSCP.TransferOptions $transferOptions.TransferMode = [WinSCP.TransferMode]::Binary $transferResult = $session.GetFiles($remotePath, $localPath, $False, $transferOptions) $transferResult.Check() } finally { $session.Dispose() }
关键修改说明:
- 添加了
$session.add_FileTransferred({ ... })事件注册,这个事件会在每个文件传输完成后立即触发,不管是成功还是失败。 - 在事件处理逻辑里,通过
$e.FileName获取当前完成的文件名,同时可以通过$e.Error判断传输是否成功,输出对应的提示。 - 原脚本中遍历
$transferResult.Transfers的代码可以移除,因为事件已经实时输出了每个文件的状态。
内容的提问来源于stack exchange,提问作者verosf98
相关产品推荐
相关产品推荐

