Экранирование символов в AzureBlobContent - PullRequest
0 голосов
/ 08 января 2019

У меня проблема с настройкой содержимого в AzureBlobStorage. На локальном компьютере мне удалось заменить символы для каждого файла в каталоге.

$sourceFolder = "C:\MyDirectory"
$targetFolder = "C:\MyDirectoryEncodeded"
$fileList = Dir $sourceFolder -Filter *.dat
MkDir $targetFolder -ErrorAction Ignore
ForEach($file in $fileList) {   
    $file | Get-Content | %{$_ -replace '"',''} | %{$_ -replace ',','.'} | Set-Content -Path "tempDirectory\$file"
    $newFile = Get-Content "tempDirectory\$file"    
    $Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $False
    [System.IO.File]::WriteAllLines("targetDirectory\$file" , $newFile,$Utf8NoBomEncoding)
}
exit

Но теперь мне нужно сделать то же самое в Microsoft Azure. Я загружаю содержимое в хранилище BLOB-объектов Azure, экранирую символы, кодирую свой файл в UTF-8NoBom, а затем устанавливаю файл кодирования в новый каталог BLOB-объектов.

Тем не менее, я столкнулся с проблемой, когда хочу установить новое содержимое с помощью escape-символов (первая строка в моем цикле).

$storageContext = New-AzureStorageContext -ConnectionString "DefaultEndpointsProtocol=https;AccountName=<myAccountName>;AccountKey=<myAccountKey>;"
$sourceFolder = Get-AzureStorageBlob -Container "datablobnotencoded" -Blob "*.dat" -Context $storageContext
$targetFolder = Get-AzureStorageBlob -Container "datablob" -Context $storageContext 
MkDir $targetFolder -ErrorAction Ignore 
ForEach($file in $sourceFolder) {
    Get-AzureStorageBlob -Container "datablobnotencoded" -Blob $file.Name -Context $storageContext | Get-AzureStorageBlobContent | %{$_ -replace '"',''} | %{$_ -replace ',','.'} | Set-AzureStorageBlobContent -File $file.Name -Context $storageContext -CloudBlob $file
    $newFile = Get-AzureStorageFileContent -Path $file 
    $Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $False
    [System.IO.File]::WriteAllLines($file , $newFile, $Utf8NoBomEncoding)
}

У меня есть эта ошибка:

Set-AzureStorageBlobContent: невозможно связать параметр 'CloudBlob'. Невозможно преобразовать "Microsoft.WindowsAzure.Commands.Storage.Model.ResourceModel.AzureStorageBlob" значение типа "Microsoft.WindowsAzure.Commands.Storage.Model.ResourceModel.AzureStorageBlob" набрать «Microsoft.WindowsAzure.Storage.Blob.CloudBlob». В строке: 7 символ: 264 + ... lobContent -File $ file.Name -Context $ storageContext -CloudBlob $ file + ~~~~~ + CategoryInfo: InvalidArgument: (:) [Set-AzureStorageBlobContent], ParameterBindingException + FullyQualifiedErrorId: CannotConvertArgumentNoMessage, Microsoft.WindowsAzure.Commands.Storage.Blob.SetAzureBlobContentCommand

Спасибо за ваши ответы!

1 Ответ

0 голосов
/ 09 января 2019

В ваших скриптах powershell есть несколько ошибок:

1.Вы можете неправильно понять использование Get-AzureStorageBlobContent, он используется для загрузки больших двоичных объектов, вы не можете получить содержимое больших двоичных объектов, более подробную информацию см. здесь .

2. В цикле вы использовали $newFile = Get-AzureStorageFileContent -Path $file, командлет Get-AzureStorageFileContent предназначен для общего хранилища файлов, а не для хранилища больших двоичных объектов.

Вы можете использовать Get-AzureStorageBlobContent для загрузки больших двоичных объектов в локальную папку, а затем работать с локальным файлом, который загружается из хранилища больших двоичных объектов. После изменения файла вы можете использовать Set-AzureStorageBlobContent для загрузки локальных файлов в указанное хранилище BLOB-объектов Azure.

Пример кода, как показано ниже, и отлично работает на моей стороне:

$context = New-AzureStorageContext -ConnectionString "xxxx"

#download the blobs in specified contianers
$sourceFolder_blob = Get-AzureStorageBlob -Container "test-1" -Blob "*.txt" -Context $context

#the target azure container, which you want to upload the modifed blob to
$taget_container="test-2"

#the local path which is used to store the download blobs, and make sure the folders exist before use.
$sourceFolder_local="d:\test\blob1\"
$targetFolder_local="d:\test\blob2\"

foreach($file in $sourceFolder_blob)
{

#download the specified blob to local path
Get-AzureStorageBlobContent -Container "test-1" -Blob $file.name -Destination $sourceFolder_local -Context $context

#get the local file path
$local_file_path=$sourceFolder_local + $file.name

#set content to the file in target local folder
$local_target_file_path = "$targetFolder_local"+$file.name


#since the files are downloaded to local, you can any operation for the local file
Get-Content $local_file_path | %{$_ -replace '-','!'} | %{$_ -replace ',','.'} | Set-Content -Path $local_target_file_path

$newFile = Get-Content -Path $local_target_file_path


$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $False
[System.IO.File]::WriteAllLines($local_target_file_path , $newFile,$Utf8NoBomEncoding)

#the last step, upload the modified file to another azure container
Set-AzureStorageBlobContent -File $local_target_file_path -Context $context -Container $taget_container
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...