Vai*_*hag 6 powershell azure-storage-account
我在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
}
Run Code Online (Sandbox Code Playgroud)
如果将$ LocalFolder设置为"\ Server\Data\subfolders001",则子文件夹001中的文件将上载到容器中.但是当我把它保持为"\ 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".
Run Code Online (Sandbox Code Playgroud)
然后在等待一段时间后发生注意我必须停止powershell脚本.
Jam*_*mie 11
我自己解决了这个问题,请参阅下面的解决方案:
$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
}
}
}
Run Code Online (Sandbox Code Playgroud)
运行:
Upload-FileToAzureStorageContainer -StorageAccountName $StorageAccountName -StorageAccountKey $StorageAccountKey -ContainerName $ContainerName -sourceFileRootDirectory $sourceFileRootDirectory -Verbose
Run Code Online (Sandbox Code Playgroud)
您应该看到它在运行时打印以下输出:
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.
Run Code Online (Sandbox Code Playgroud)
我承认这并不完美,但需要付出一些努力才能扩展它以满足更复杂的场景文件上传的需要,但是如果你想将目录的内容上传到目标存储容器,它应该可以解决问题.
Azure存储容器本质上是不能包含其他存储容器的目录.因此,为了在Azure存储容器中实现文件夹结构,您需要在文件前面添加直到您开始搜索的根文件夹的路径.即如果你的根是:
D:\Files
Run Code Online (Sandbox Code Playgroud)
和文件包含:
Folder 1
-> File 1.txt
File 2.txt
Run Code Online (Sandbox Code Playgroud)
您需要将目标路径设置为
$StorageContainerObject.CloudBlobContainer.Uri.AbsoluteUri + "\Files\Folder 1\File 1.txt"
$StorageContainerObject.CloudBlobContainer.Uri.AbsoluteUri + "\Files\File 2.txt"
Run Code Online (Sandbox Code Playgroud)
如果使用Azure Storage Explorer等工具查看存储容器,则即使文件全部存储在一个容器中,它也会识别文件结构.
谢谢,
杰米
小智 1
Azure Blob 存储只有一层文件夹 -容器。
相反,您可以使用下面的几个选项
| 归档时间: |
|
| 查看次数: |
8712 次 |
| 最近记录: |