gpt4 book ai didi

powershell - 将文件和文件夹上载到Azure Blob存储

转载 作者:行者123 更新时间:2023-12-04 10:23:53 26 4
gpt4 key购买 nike

我已经在Azure中创建了一个存储帐户并创建了一个容器。我正在尝试上传存储在服务器中的文件,这些文件存储在800个文件夹中。
我尝试使用此Powershell脚本执行此操作,但是它不适用于子文件夹。

$LocalFolder = "\\Server\Data" 

Add-AzureAccount


# Set a default Azure subscription.
Select-AzureSubscription -SubscriptionName 'nameofsubscription' –Default


$Key = Get-AzureStorageKey -StorageAccountName mydatastorename

$Context = New-AzureStorageContext -StorageAccountKey $Key.Primary -StorageAccountName mydatastorename

foreach ($folder in Get-ChildItem $LocalFolder)
{

ls –Recurse –Path $LocalFolder |Set-AzureStorageBlobContent -Container nameofcontainer -Context $Context -BlobType Block
}

如果将$ LocalFolder设置为“\Server\Data\subfolders001”,则subfolder001中的文件将上载到容器。但是,当我将其保存为“\Server\Data”时,它将无法正常工作。

我希望脚本将其中的所有子文件夹和文件上传到存储容器中。

我添加了运行时得到的输出

我没有收到任何错误消息,但是每个子文件夹都有一个警告消息
 WARNING: Can not upload the directory '\\Server\Data\subfolders001' to azure. If you want to upload directory, please use "ls -File -Recurse | Set-AzureStorageBlobContent -Container containerName".

然后,在我不得不停止powershell脚本之后,便注意到了这一点。

最佳答案

自己解决这个问题,请参阅下面的解决方案:

$StorageAccountName = "storageAccountName"
$StorageAccountKey = "StorageAccountKey"
$ContainerName = "ContainerName"
$sourceFileRootDirectory = "AbsolutePathToStartingDirectory" # i.e. D:\Docs

function Upload-FileToAzureStorageContainer {
[cmdletbinding()]
param(
$StorageAccountName,
$StorageAccountKey,
$ContainerName,
$sourceFileRootDirectory,
$Force
)

$ctx = New-AzureStorageContext -StorageAccountName $StorageAccountName -StorageAccountKey $StorageAccountKey
$container = Get-AzureStorageContainer -Name $ContainerName -Context $ctx

$container.CloudBlobContainer.Uri.AbsoluteUri
if ($container) {
$filesToUpload = Get-ChildItem $sourceFileRootDirectory -Recurse -File

foreach ($x in $filesToUpload) {
$targetPath = ($x.fullname.Substring($sourceFileRootDirectory.Length + 1)).Replace("\", "/")

Write-Verbose "Uploading $("\" + $x.fullname.Substring($sourceFileRootDirectory.Length + 1)) to $($container.CloudBlobContainer.Uri.AbsoluteUri + "/" + $targetPath)"
Set-AzureStorageBlobContent -File $x.fullname -Container $container.Name -Blob $targetPath -Context $ctx -Force:$Force | Out-Null
}
}
}

运行:
Upload-FileToAzureStorageContainer -StorageAccountName $StorageAccountName -StorageAccountKey $StorageAccountKey -ContainerName $ContainerName -sourceFileRootDirectory $sourceFileRootDirectory -Verbose

您应该看到它在运行时输出以下输出:
VERBOSE: Uploading testfile.json to https://storagecontainername.blob.core.windows.net/path/testfile.json
VERBOSE: Performing the operation "Set" on target "/path/testfile.json".
ICloudBlob : Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob
BlobType : BlockBlob
Length : 0
ContentType : application/octet-stream
LastModified : 23/03/2017 14:20:53 +00:00
SnapshotTime :
ContinuationToken :
Context : Microsoft.WindowsAzure.Commands.Common.Storage.AzureStorageContext
Name : /path/testfile.json

VERBOSE: Transfer Summary
--------------------------------
Total: 1.
Successful: 1.
Failed: 0.

我承认这不是完美的方法,但是您可以稍作努力就可以扩展它以适应更复杂的方案文件上载,但是如果您想将目录的内容上载到目标存储容器,它应该可以解决问题。

Azure存储容器本质上是不能包含其他存储容器的目录。因此,为了在Azure存储容器中实现文件夹结构,您需要为文件添加从开始搜索的根文件夹开始的路径的前缀。 IE。如果您的根是:
D:\Files

并且文件包含:
Folder 1
-> File 1.txt
File 2.txt

您需要将目标路径设置为
$StorageContainerObject.CloudBlobContainer.Uri.AbsoluteUri + "\Files\Folder 1\File 1.txt"
$StorageContainerObject.CloudBlobContainer.Uri.AbsoluteUri + "\Files\File 2.txt"

如果使用诸如Azure Storage Explorer之类的工具查看存储容器,则即使文件全部存储在一个容器中,它也会识别文件结构。

谢谢,

杰米

关于powershell - 将文件和文件夹上载到Azure Blob存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38354888/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com