无需将文件写入磁盘即可下载 PowerShell SFTP

PowerShell SFTP Download without Writing Files to Disk

我正在尝试使用 PowerShell 将存储在 SFTP 上的工资单文件同步到 SharePoint。我已经编写了大部分代码,我唯一想不通的是是否有办法避免将文件临时下载到磁盘。考虑到这些文件的敏感性,我宁愿将文件存储为一个变量,这与 get-content 的工作方式不同,这样 Jenkins slave 上的任何人都无法看到其内容或取消删除临时文件。

这是我下载文件的工作代码:

$session = New-Object WinSCP.Session
$session.Open($sessionOptions)
$file = $session.ListDirectory("/") | select -ExpandProperty files | ? {$_.FileType -ne "D"} | select -First 1
$session.GetFiles($file, "c:\temp$($file.name)", $False, $transferOptions)
$session.Close()

有什么东西可以用来替换 WinSCP.Session.GetFiles [C:\temp\$($file.name)] 的第二个参数,这样我就可以将文件直接放到内存中这样我就可以转储并将其转储到 SharePoint?

如果您想知道我如何将它放入共享点,我已经将它与 get-content 一起使用,没有任何问题:

$fileToUpload = get-content c:\temp\test.csv -Encoding Byte
$FileCreationInfo = New-Object Microsoft.SharePoint.Client.FileCreationInformation
$FileCreationInfo.Overwrite = $true
$FileCreationInfo.Content = $fileToUpload
$FileCreationInfo.Overwrite = $true
$FileCreationInfo.Url = "test.csv"
$Upload = $Folder.Files.Add($FileCreationInfo)
$Ctx.Load($Upload)
$Ctx.ExecuteQuery()

使用 Session.GetFile method.

自 WinSCP 5.18 beta 以来支持流式传输远程文件的上下文
$stream = $session.GetFile($file)

WinSCP 根本不会这样做。我一直希望下游对象能够替换文件路径,但这似乎不可能。但是我确实弄清楚了。转到 posh-ssh 模块,我能够使用 Get-SFTPContent 命令,它允许我将文件读入内存。

install-module posh-ssh
import-module posh-ssh
$Session = New-SFTPSession -ComputerName $SFTPHostName -Credential $SFTPcredential
Get-SFTPContent -SessionId $session.SessionId -Path $file.FullName -Encoding unicode -ContentType byte