Использование командной строки из C # для копирования контейнера с помощью AzCopy

Я пытаюсь скопировать контейнеры в Azure из одного места хранения в другое. Для этого я использую команду AzCopy. Сначала я получаю список всех контейнеров, а затем запускаю AzCopy на основе имени контейнера из командной строки, используя код C #.

Проблема, с которой я столкнулся, заключается в том, что он копирует контейнеры из одного места в другое, но после 4 контейнеров он, кажется, застревает. И тест продолжается вечно. Когда я отменяю тест, я вижу, что все остальные контейнеры также копируются.

Мне было интересно, как я могу решить эту проблему, когда тест будет завершен и все папки будут скопированы. Я старался подождать после каждого звонка, чтобы убедиться, что у меня достаточно времени для завершения звонка. Также пробовал использовать cmd.WaitForExit (); после каждого звонка, но он просто застревает.

Любые предложения о том, чего мне может не хватать, я хотел получить результат после каждого вызова, потому что сейчас он выводит результат только после того, как все команды будут завершены. Также думал о том, как запускать вызов командной строки последовательно, чтобы запускать только после завершения первого.

Любая помощь будет оценена по достоинству!

namespace Test2
 {
[TestFixture]
class ContainerList
{
    [Test]
    public void CopyingContainerData()
    {
        CloudStorageAccount sourceCloudStorageAccount =
         CloudStorageAccount.Parse("StorageAccountKey");
         CloudBlobClient sourceCloudBlobClient = sourceCloudStorageAccount.CreateCloudBlobClient();
         List<string> outputLines = new List<string>();
         IEnumerable<CloudBlobContainer> containers = sourceCloudBlobClient.ListContainers();


         Process cmd = new Process();
         cmd.StartInfo.FileName = "cmd.exe";
         cmd.StartInfo.RedirectStandardInput = true;
         cmd.StartInfo.RedirectStandardOutput = true;
         cmd.StartInfo.CreateNoWindow = false;
         cmd.StartInfo.UseShellExecute = false;
         cmd.Start();
         int i = 0;

         foreach (CloudBlobContainer oneContainer in containers)
         {

                 string outputLine = oneContainer.Name;
                 outputLines.Add(outputLine);
                 string container = oneContainer.Name;
               string strCmdText =   @"AzCopy /Source:https://location1.blob.core.windows.net/" + container + @" /Dest:https://location2.blob.core.windows.net/" + container + @" /SourceKey:abc /DestKey:abc123 /S /NC:8 /XO /Y";
                 string location = @"cd C:\Program Files (x86)\Microsoft SDKs\Azure\AzCopy";

                 cmd.StandardInput.WriteLine(location);
                 cmd.StandardInput.WriteLine(strCmdText);
                 //System.Threading.Thread.Sleep(20000);
                 //cmd.WaitForExit();

                 i++;

             if (i == 15)
             {
                 break;
             }

         }
        string[] outputText = outputLines.ToArray();
        File.WriteAllLines(@"C:\AzureTests\CopyData.txt", outputText);


         cmd.StandardInput.Flush();
         cmd.StandardInput.Close();
         Console.WriteLine(cmd.StandardOutput.ReadToEnd());



    }
}
 }

person chillax786    schedule 05.05.2016    source источник
comment
Это не дает прямого ответа на ваш вопрос, но смотрели ли вы, используя Библиотека перемещения данных, которая в основном представляет собой функцию AzCopy, которую можно вызывать программно? Это избавит от необходимости вызывать оболочку.   -  person BenV    schedule 05.05.2016
comment
Работает ли этот код, если я хочу загрузить локальные файлы в хранилище BLOB-объектов Azure? Я написал тот же код, но cmd выдает для меня исключение.   -  person Emil    schedule 13.10.2016
comment
Код должен работать. Что за исключение?   -  person chillax786    schedule 15.10.2016
comment
Кто-нибудь получил AzCopy, работающий от успеха .Net?   -  person Joy George Kunjikkuru    schedule 04.10.2017
comment
@JoyGeorgeKunjikkuru Да, у меня AzCopy работал из кода C #, вызывая командную строку.   -  person chillax786    schedule 19.10.2017


Ответы (2)


Я предлагаю вам использовать PowerShell для этого:

$SourceStorageAccount = "sourceStorageAccount"
$SourceStorageKey = "sourceKey"
$DestStorageAccount = "destStorageAccount"
$DestStorageKey = "destKey"

$SourceStorageContext = New-AzureStorageContext –StorageAccountName $SourceStorageAccount -StorageAccountKey $SourceStorageKey
$DestStorageContext = New-AzureStorageContext –StorageAccountName $DestStorageAccount -StorageAccountKey $DestStorageKey

$containers = Get-AzureStorageContainer -Context $SourceStorageContext

foreach($container in $containers) {  
    New-AzureStorageContainer -Context $DestStorageContext -Name $container.name -Permission Off

    $Blobs = Get-AzureStorageBlob -Context $SourceStorageContext -Container $container.name

    #Do the copy of everything
    foreach ($Blob in $Blobs) {
       Write-Output "Moving $Blob.Name"
       Start-CopyAzureStorageBlob -Context $SourceStorageContext -SrcContainer $container.name -SrcBlob $Blob.Name `
          -DestContext $DestStorageContext -DestContainer $container.name -DestBlob $Blob.Name
    } 
}
person Alex Chen-WX    schedule 06.05.2016
comment
Это будет копировать только капли из одного контейнера ... Если бы у меня было 100 контейнеров, разве мне не нужно было бы запускать этот скрипт 100 раз, каждый раз обновляя имя контейнера? - person chillax786; 06.05.2016
comment
Я обновил свой ответ. Теперь вы можете скопировать все свои контейнеры / большие двоичные объекты из одной учетной записи хранения в другую. Я тестировал его у себя на родине. - person Alex Chen-WX; 09.05.2016
comment
Означает ли это, что AzCopy.exe, вызванный из .Net, не вернется? Мы должны использовать PS для обработки? - person Joy George Kunjikkuru; 04.10.2017

У нас был аналогичный сценарий, когда вызов AzCopy.exe не возвращал управление в .Net. Причина - параллельное выполнение AzCopy.exe без указания файлов журнала. По умолчанию он предоставляет общий доступ к файлам журнала и получает нарушение прав доступа. Когда мы отправили разные файлы журнала в разные экземпляры AzCopy, он начал работать.

Запуск нескольких экземпляров AzCopy.exe из .Net

person Joy George Kunjikkuru    schedule 24.10.2017