如何制作 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.PutFilesremotePath(第二个)参数是:

上传文件的完整路径。

虽然您似乎只传递了文件夹的路径,而不是文件的完整路径。

这应该是正确的:

$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 中的电源计划并在长脚本后恢复为原始设置?

从 powershell 脚本运行 cmd 命令

Powershell脚本找不到C盘

如何从其他powershell脚本调用powershell脚本并且脚本是在powershell对象而不是文件中分配的

PowerShell批量部署Hyper-V Windows虚机