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

如何使用Powershell从Azure存储下载blob文件并将其保存到FTP服务器?,powershell,ftp,azure-storage-blobs,azure-powershell,Powershell,Ftp,Azure Storage Blobs,Azure Powershell,我正在尝试访问PowerShell中的blob文件,并希望将其直接保存到FTP服务器。如何做到这一点?这可以通过blob文件URL完成吗?或者我可以在Powershell内存中创建文件,然后使用$webclient.UploadFile将其保存到FTP文件夹中吗 与此下载相关的另一个问题是,有没有办法只复制文件而不复制子目录?例如,我有一个blob文件,如:dataload/files/my_blob_file。当我使用命令Get-AzureStorageBlobContent-Destinat

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

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

我正在尝试访问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\u blob\u文件而不是c:\myfolder\dataload\files\my\u blob\u文件

当然,只需指定路径和文件名作为目标参数:

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

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

更新:

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

你可能需要实现你的目标

Azure Automation中的运行手册无法访问本地数据中心中的资源,因为它们在Azure云中运行。Azure Automation的混合Runbook Worker功能允许您在位于数据中心的计算机上运行Runbook,以管理本地资源

我使用的是默认的21端口,我还尝试使用我的公共IP地址

不建议将FTP服务器公开到Internet。我建议使用混合Runbook Worker


另外,如何将blob文件的内容放入Powershell变量中,以便在脚本中使用它

据我所知,不支持在RAM中返回对象。您需要先下载内容,然后使用“获取内容”来获取文件内容。如果使用混合Runbook Worker,您将能够在本地存储该文件

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


我正在尝试了解如何调用任何外部FTP服务器(当前在我的机器上用于开发/测试,但可能位于生产中的任何其他外部服务器上),我必须从Azure Automation中的Powershell脚本运行它。所以您的回答是:您可能需要混合Runbook Worker来实现您的目标。。。不会对我有用吧

混合Runbook Worker为您工作。这让事情变得更容易。因为如果使用混合Runbook Worker,Runbook将在本地计算机上运行

我可以将blob下载到我的本地机器上,并将它们上传到公共FTP服务器上,而不会出现任何问题

您是说目前无法从Azure Powershell Automation从外部FTP服务器上载和下载文件吗

我没有成功地将blob上载到公共FTP服务器。当我尝试上载blob时,只有名为blob的空文件被上载到FTP服务器时,会发生异常。这可能是权限问题,因为PowerShell脚本正在沙箱中运行。这就是为什么我说混合Runbook Worker让事情变得更简单的原因

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

我正在尝试访问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服务器上运行脚本

如果脚本无法在服务器上运行一段时间