使用PowerShell原生命令从SFTP下载单个文件(SSMS作业场景)
解决SFTP文件下载的原生Windows方案及错误分析
错误原因
Invoke-WebRequest仅支持HTTP/HTTPS/FTP协议,不兼容SFTP,所以你使用SFTP格式的路径会触发"The URI prefix is not recognized"错误。
原生Windows实现SFTP下载的方法
Windows 10 1809及以上、Windows Server 2019及以上版本默认自带OpenSSH客户端,属于系统原生工具,无需额外安装第三方软件。可以通过sftp命令行完成文件传输,适合集成到SSMS作业中。
脚本示例(两种路径写法)
1. 不拆分远程目录与文件名
直接指定完整远程路径,适合单文件固定传输场景:
# 配置参数 $sftpUser = "myusername" $sftpPass = "mypassword" $sftpServer = "ftp.companyname.com" $remoteFile = "/remotetestfolder/TestBlankFile.xlsx" $localFile = "C:\Users\....\...\Desktop\TestBlankFile2.xlsx" # 生成sftp命令脚本(避免交互输入密码) $scriptContent = @" get $remoteFile $localFile quit "@ $scriptPath = "C:\temp\sftp_download_script.txt" Set-Content -Path $scriptPath -Value $scriptContent -Encoding ASCII # 调用sftp命令执行下载 echo $sftpPass | sftp -b $scriptPath $sftpUser@$sftpServer # 清理临时脚本文件 Remove-Item -Path $scriptPath -Force
2. 拆分远程目录与文件名(更灵活)
拆分后可单独调整目录或文件名,方便后续扩展批量处理逻辑:
# 配置参数 $sftpUser = "myusername" $sftpPass = "mypassword" $sftpServer = "ftp.companyname.com" $remoteDir = "/remotetestfolder" $remoteFileName = "TestBlankFile.xlsx" $localFile = "C:\Users\....\...\Desktop\TestBlankFile2.xlsx" # 生成sftp命令脚本 $scriptContent = @" cd $remoteDir get $remoteFileName $localFile quit "@ $scriptPath = "C:\temp\sftp_download_script.txt" Set-Content -Path $scriptPath -Value $scriptContent -Encoding ASCII # 执行下载 echo $sftpPass | sftp -b $scriptPath $sftpUser@$sftpServer # 清理临时文件 Remove-Item -Path $scriptPath -Force
SSMS作业配置步骤
- 打开SSMS,创建新作业,添加执行PowerShell类型的步骤。
- 将上述PowerShell脚本复制到步骤的命令框中,替换为实际的账户、路径参数。
- 确保作业执行账户拥有以下权限:
- SFTP服务器目标文件的读取权限
- 本地目标目录的写入权限
- 系统
sftp命令的执行权限
- 运行作业测试,检查文件是否成功下载到本地路径。
注意事项
- 若你的Windows版本未自带OpenSSH客户端,可通过「设置-应用-可选功能-添加功能」搜索安装「OpenSSH客户端」。
- 明文传递密码存在安全风险,生产环境建议使用SSH密钥认证:将本地公钥上传至SFTP服务器的用户
authorized_keys文件中,脚本即可去掉密码相关代码,直接运行sftp -b $scriptPath $sftpUser@$sftpServer。 - 临时脚本文件建议放在有权限的临时目录,避免权限访问问题。
内容的提问来源于stack exchange,提问作者PowerUser
相关产品推荐
相关产品推荐

