如何从Azure存储下载blob文件并使用Powershell将其保存到FTP服务器?

时间:2017-04-04 13:57:57

标签: powershell ftp azure-storage-blobs azure-powershell

我正在尝试访问PowerShell中的blob文件,并希望将其直接保存到FTP服务器。如何才能做到这一点?这可以通过blob文件URL完成吗?或者我可以以某种方式在Powershell内存中创建文件,然后使用$ webclient.UploadFile将其保存到FTP文件夹中?

与此相同下载有关的另一个问题是,有没有办法只复制文件而不是复制子目录?例如,我有一个blob文件,如:dataload / files / my_blob_file。当我使用命令Get-AzureStorageBlobContent -Destination $ destination_path时,它将文件保存在相同的子文件夹结构中,但是我可以改为使用自定义路径或删除子文件夹并将其保存为c:\ myfolder \ my_blob_file而不是c:\ myfolder \数据加载\文件\ my_blob_file?我想在上面的FTP服务器中完成这个。

1 个答案:

答案 0 :(得分:2)

  

我正在尝试访问PowerShell中的blob文件,并希望将其直接保存到FTP服务器。

如果您的FTP服务器是基于Windows的,那么您只需在FTP服务器上运行脚本并将blob下载到此FTP服务器的本地路径中。

  

可以通过blob文件URL完成吗?

命令“Get-AzureStorageBlobContent”不接受URL作为参数。这意味着您需要编写代码或脚本来实现这一目标。这是我写的一个简单的演示:

$url = "https://accountname.blob.core.windows.net/testcontainer/Test01.txt"
$separator = "://"
$option = [System.StringSplitOptions]::RemoveEmptyEntries
$temp = $url.Split($separator,4,$option)
$Protocol = $temp[0]
$HostName = $temp[1]
$Container = $temp[2]
$BlobName = $temp[3]
  

或者我可以以某种方式在Powershell内存中创建文件,然后使用$ webclient.UploadFile将其保存到FTP文件夹中?

即使我们能够实现这一目标,将文件存储到RAM中也不是一个好的理想选择。如上所述,如果您的FTP服务器是基于Windows的,请直接在FTP服务器上运行脚本。

如果由于任何原因无法在服务器上运行脚本,请尝试共享FTP服务使用的文件夹,并将其作为网络驱动程序映射到将运行该脚本的计算机上。这样您就可以将文件存储到此网络驱动程序中。

  

但是我可以改为使用自定义路径或删除子文件夹并将其保存为c:\ myfolder \ my_blob_file而不是c:\ myfolder \ dataload \ files \ my_blob_file吗?

当然,只需将路径和文件名指定为Destination参数:

Destination

注意:实际上,Azure存储上没有“文件夹”的概念。该路径是blob名称的一部分。下载blob时,可以通过在目标路径中指定文件名来重命名blob。这样就不会在本地文件夹上创建附加文件夹。

=============================================== ==========================

更新

  

此脚本将作为Azure自动化的一部分从Azure运行。但是当我尝试调用FTP服务器(当前是我的本地机器)时,我收到“无法连接到远程服务器”错误。

您可能需要Hybrid Runbook Worker才能实现目标。

Azure自动化中的Runbook无法访问本地数据中心中的资源,因为它们在Azure云中运行。 Azure自动化的Hybrid Runbook Worker功能允许您在位于数据中心的计算机上运行Runbook来管理本地资源。

  

我正在使用默认的21端口,我也尝试使用我的公共IP地址

建议不要将FTP服务器暴露在Internet上。我建议使用Hybrid Runbook Worker。

  

另外,如何将我的blob文件的内容转换为Powershell变量以在脚本中使用它?

据我所知,Get-​Azure​Storage​Blob​Content不支持在RAM中返回一个对象。您需要先下载内容,然后使用Get-Content获取文件内容。如果您使用Hybrid Runbook Worker,您将能够在本地存储该文件。

=============================================== =============================== 更新2:

  

我试图了解如何调用任何外部FTP服务器(当前在我的机器上用于开发/测试目的,但可能驻留在生产中的任何其他外部服务器上),我必须从Azure自动化中的Powershell脚本。所以你的回复:你可能需要Hybrid Runbook Worker来实现你的目标......对我不起作用吗?

Hybrid Runbook Worker为您服务。它使事情变得更容易。因为如果您使用Hybrid Runbook Worker,Runbook将在您的本地计算机上运行。

我可以将blob下载到我的本地计算机上,并将它们上传到公共FTP服务器,没有任何问题。

  

您是说当前无法从Azure Powershell Automation上传和下载外部FTP服务器的文件?

我没有成功将blob上传到公共FTP服务器。当我尝试上载blob并且只将具有blob名称的空文件上载到FTP服务器时发生异常。由于PowerShell脚本在沙箱中运行,因此可能是权限问题。这就是为什么我说Hybrid Runbook Worker让事情变得更容易的原因。

最后请注意:FTP验证用户并以明文传输日期,这可能会导致安全问题。 FTPS和SFTP比FTP更安全。