Используя модуль Az
PowerShell, я пытаюсь перечислить каталог на диске и направить вывод в Set-AzStorageBlobContent
для загрузки в Azure, сохраняя при этом структуру папок. Это прекрасно работает, за исключением того, что свойство ContentType
всех BLOB-объектов установлено на application/octet-stream
. Я хотел бы установить его динамически в зависимости от расширения файла загружаемого большого двоичного объекта.
Вот пример кода для базового случая:
Get-ChildItem $SourceRoot -Recurse -File |
Set-AzStorageBlobContent -Container $ContainerName -Context $context -Force
Чтобы установить ContentType
, я необходимо добавить Properties
параметр к Set-AzStorageBlobContent
со значением, подобным @{ "ContentType" = "<content type>" }
. Тип содержимого должен определяться по указанному расширению файла c, которое загружается. Я написал отдельную конвейерную функцию, которая может добавить свойство MimeType
к объекту файла, но я не могу понять, как ссылаться на это для параметра в конвейере. Пример:
function Add-MimeType{
[cmdletbinding()]
param(
[parameter(
Mandatory = $true,
ValueFromPipeline = $true)]
$pipelineInput
)
Process {
$mimeType = Get-MimeType $pipelineInput.Extension
Add-Member -InputObject $pipelineInput -NotePropertyName "MimeType" -NotePropertyValue $mimeType
return $pipelineInput
}
}
function Get-MimeType(
[string]$FileExtension
)
{
switch ($FileExtension.ToLowerInvariant())
{
'.txt' { return 'text/plain' }
'.xml' { return 'text/xml' }
default { return 'application/octet-stream' }
}
}
Get-ChildItem $SourceRoot -Recurse -File |
Add-MimeType |
Set-AzStorageBlobContent -Container $ContainerName -Properties @{"ContentType" = "$($_.MimeType)"} -Context $context -Force
Кажется, что $_
не может использоваться в этом контексте. Есть ли другой способ выполнить sh это?
Причина, по которой я хотел бы продолжить использовать конвейерную обработку, заключается в том, что она работает намного быстрее, чем при использовании ForEach-Object
l oop для вызова функции ( где $_
работает).