Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C#中的命令行使用AzCopy复制容器_C#_Azure_Command Line_Azure Storage_Azcopy - Fatal编程技术网

使用C#中的命令行使用AzCopy复制容器

使用C#中的命令行使用AzCopy复制容器,c#,azure,command-line,azure-storage,azcopy,C#,Azure,Command Line,Azure Storage,Azcopy,我正在尝试将Azure中的容器从一个存储位置复制到另一个存储位置。我正在使用AzCopy命令进行此操作。首先,我获取所有容器的列表,然后使用c#代码,根据命令行中的容器名称运行AzCopy 我遇到的问题是,它确实将容器从一个位置复制到另一个位置,但在4个容器之后,它似乎卡住了。测试将永远运行。当我取消测试时,我看到所有其他容器也被复制 我想知道如何才能解决这个问题,让测试完成,所有的文件夹都复制过来。我试着在每次通话后等待,以确保有足够的时间完成通话。还尝试使用cmd.WaitForExit()

我正在尝试将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());



    }
}
 }
namespace Test2
{
[测试夹具]
类容器列表
{
[测试]
public void CopyingContainerData()
{
CloudStorageAccount sourceCloudStorageAccount=
解析(“StorageAccountKey”);
CloudBlobClient sourceCloudBlobClient=sourceCloudStorageAccount.CreateCloudBlobClient();
List outputLines=新列表();
IEnumerable containers=sourceCloudBlobClient.ListContainers();
Process cmd=新流程();
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容器中的一个容器)
{
字符串outputLine=oneContainer.Name;
添加(outputLine);
string container=oneContainer.Name;
字符串strCmdText=@“AzCopy/源:https://location1.blob.core.windows.net/“+容器+@”/Dest:https://location2.blob.core.windows.net/“+container+@”/SourceKey:abc/DestKey:abc123/S/NC:8/XO/Y”;
字符串位置=@“cd C:\Program Files(x86)\Microsoft SDK\Azure\AzCopy”;
cmd.StandardInput.WriteLine(位置);
cmd.StandardInput.WriteLine(strCmdText);
//系统。线程。线程。睡眠(20000);
//cmd.WaitForExit();
i++;
如果(i==15)
{
打破
}
}
string[]outputText=outputLines.ToArray();
writeAllines(@“C:\AzureTests\CopyData.txt”,outputText);
cmd.StandardInput.Flush();
cmd.StandardInput.Close();
Console.WriteLine(cmd.StandardOutput.ReadToEnd());
}
}
}

我建议您使用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
    } 
}

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


这并不能直接回答您的问题,但您是否考虑过使用,这基本上是您可以通过编程调用的AzCopy功能?这将消除调用shell的需要。如果我想将本地文件上载到azure blob存储中,这段代码是否有效?我写了相同的代码,但cmd为我抛出了异常。代码应该正常工作。例外情况是什么?有人让AzCopy从.Net成功运行吗?@JoyGeorgeKunjikkuru是的,我让AzCopy通过调用命令行从C#代码运行。这只会从一个容器中复制blob…如果我有100个容器,每次更新容器名称时是否需要运行此脚本100次?我更新了答案。现在,您可以将所有容器/blob从一个存储帐户复制到另一个存储帐户。我已经在本地进行了测试。这是否意味着从.Net调用的AzCopy.exe将不会返回?我们应该用PS来处理?