如何制作 PowerShell FTPS 脚本 (SSL) 来上传单个文件?
Posted
技术标签:
【中文标题】如何制作 PowerShell FTPS 脚本 (SSL) 来上传单个文件?【英文标题】:How to make a PowerShell FTPS script (SSL) to upload a single file? 【发布时间】:2019-01-31 02:55:11 【问题描述】:我需要一个脚本来帮助我将单个文件上传到云端。
我找到了一些使用 SFTP (SSH) 协议的答案,但我找不到使用 FTPS (SSL) 的脚本。
我试过这个脚本,但它不起作用:
Add-Type -Path "C:\Program Files (x86)\WinSCP\WinSCPnet.dll"
$sessionOptions = New-Object WinSCP.SessionOptions
$sessionOptions.ParseUrl("**ftps**://**login**:**password**@**ipoftheremoteserver**:990/")
$session = New-Object WinSCP.Session
$session.Open($sessionOptions)
$session.PutFiles("D:\QAPPLI\Quadra\DATABASE\PAIE\000001\qpaie.mdb", "/FOLDER1/08h00").Check()
$session.Dispose()
我有这个错误:
PS C:\Windows\system32> D:\Script\08h00_000001_Client1_to_ftps.ps1 异常 lors de l'appel de « Check » avec « 0 » 参数: « Erreur lors du transfert du fichier 'D:\QAPPLI\Quadra\DATABASE\PAIE\000001\qpaie.mdb'。 服务器发送了带有不可路由地址 172.16.59.131 的被动回复,而是使用主机地址。 Copie de fichiers 与 le coté 遥远的 échouée。 文件名无效 A niveau de D:\08h00_000001_Client1_to_ftps.ps1:8 品种:85 + $session.PutFiles("D:\QAPPLI\Quadra\DATABASE\PAIE\000001\qpaie.mdb", "/FOLDER1/08h00").Check
翻译成英文:
D:Script08h00_000001_Client1_to_ftps.ps1 使用“0”参数调用“Check”时出现异常:«“传输文件时出错'D:QAPPLIQuadraDATABASEPAIE000001qpaie.mdb'。服务器使用主机地址发送了不可路由地址172.16.59.131的被动回复而是。 将文件复制到失败的远程端。 文件名无效 在 D:08h00_000001_Client1_to_ftps.ps1:8 字符:85 + $session。 PutFiles ("D:QAPPLIQuadraDATABASEPAIE000001qpaie.mdb", "/FOLDER1/08h00")。检查
非常感谢您的帮助。
【问题讨论】:
你应该用英文翻译你的错误信息。另请参阅this SO 关于发送被动回复的问题的答案。 【参考方案1】:Session.PutFiles
的remotePath
(第二个)参数是:
上传文件的完整路径。
虽然您似乎只传递了文件夹的路径,而不是文件的完整路径。
这应该是正确的:
$session.PutFiles(
"D:\QAPPLI\Quadra\DATABASE\PAIE\000001\qpaie.mdb", "/FOLDER1/08h00/qpaie.mdb").Check()
【讨论】:
M A N Y T H A N K S ! ! ! ! !有用 ! ! ! ! ! !【参考方案2】:在 PowerShell 中使用 .Net Framework 的 FTPWebRequest 类,通过 EnableSsl 属性启用 FTPS
[Net.ServicePointManager]::ServerCertificateValidationCallback=$true
$Dir = "D:\FolderWithBackupFilesToMove"
foreach($item in (dir $dir))
write-output "-------------"
$fileName = $item.FullName
write-output $fileName
$ftp = [System.Net.FtpWebRequest]::Create("ftp://some.ftp.server.com/someRootFolder/"+$item.Name)
$ftp = [System.Net.FtpWebRequest]$ftp
$ftp.UsePassive = $true
$ftp.UseBinary = $true
$ftp.EnableSsl = $true
$ftp.Credentials = new-object System.Net.NetworkCredential("UserName","Password")
$ftp.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile
$rs = $ftp.GetRequestStream()
$reader = New-Object System.IO.FileStream ($fileName, [IO.FileMode]::Open, [IO.FileAccess]::Read, [IO.FileShare]::Read)
[byte[]]$buffer = new-object byte[] 4096
[int]$count = 0
do
$count = $reader.Read($buffer, 0, $buffer.Length)
$rs.Write($buffer,0,$count)
while ($count -gt 0)
$reader.Close()
$rs.Close()
write-output "+transfer completed"
$item.Delete()
write-output "+file deleted"
【讨论】:
你能在你的答案中添加一些关于所有代码的解释吗?哪些部分与解决问题相关?以上是关于如何制作 PowerShell FTPS 脚本 (SSL) 来上传单个文件?的主要内容,如果未能解决你的问题,请参考以下文章
FTPS (FTP over SSL) vs. SFTP (SSH 文件传输协议): 我们如何做出选择
如何使用 Powershell 更改 Windows 10 中的电源计划并在长脚本后恢复为原始设置?