4

我正在尝试将 Azure 中的容器从一个存储位置复制到另一个存储位置。为此,我正在使用 AzCopy 命令。首先,我获取所有容器的列表,然后使用 c# 代码从命令行根据容器名称运行 AzCopy。

我遇到的问题是它确实将容器从一个位置复制到另一个位置,但是在 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());



    }
}
 }
4

2 回答 2

1

我建议您使用 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
    } 
}
于 2016-05-06T09:25:47.903 回答
0

我们有类似的 AzCopy.exe 调用场景没有将控制权返回给 .Net。原因是在未指定日志文件的情况下并行执行 AzCopy.exe。它默认共享日志文件并获得访问冲突。当我们向不同的 AzCopy 实例发布不同的日志文件时,它开始工作。

从 .Net 运行多个 AzCopy.exe 实例

于 2017-10-24T14:28:06.410 回答