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」として保持すると、機能しません。
スクリプトで、その中のすべてのサブフォルダーとファイルをストレージコンテナーにアップロードする必要があります。
実行したときに得られる出力を追加しました
エラーメッセージは表示されませんが、サブフォルダごとに1つの警告メッセージが表示されます
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 Storage Containersは基本的に、他のストレージコンテナーを含めることができないディレクトリです。そのため、Azure Storage Containerにフォルダー構造を実装するには、検索を開始したルートフォルダーまでのパスをファイルの前に付ける必要があります。つまりあなたのルートが:
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などのツールを使用してストレージコンテナーを表示すると、ファイルがすべて1つのコンテナー内に格納されている場合でも、ファイル構造が認識されます。
ありがとう、
ジェイミー
Azure Blob Storageには、フォルダーのレベルが1つだけあります-containers。
代わりに、以下のいくつかのオプションを使用できます