使用C#中的命令行使用AzCopy复制容器
我正在尝试将Azure中的容器从一个存储位置复制到另一个存储位置。我正在使用AzCopy命令进行此操作。首先,我获取所有容器的列表,然后使用c#代码,根据命令行中的容器名称运行AzCopy 我遇到的问题是,它确实将容器从一个位置复制到另一个位置,但在4个容器之后,它似乎卡住了。测试将永远运行。当我取消测试时,我看到所有其他容器也被复制 我想知道如何才能解决这个问题,让测试完成,所有的文件夹都复制过来。我试着在每次通话后等待,以确保有足够的时间完成通话。还尝试使用cmd.WaitForExit();每次打电话后,都会被卡住 任何关于我可能遗漏什么的建议,我想做的一件事是在每次调用后获得输出,因为现在它只在所有命令完成后输出结果。还考虑了如何按顺序运行命令行调用,以便只在第一次调用完成后运行 任何帮助都将不胜感激使用C#中的命令行使用AzCopy复制容器,c#,azure,command-line,azure-storage,azcopy,C#,Azure,Command Line,Azure Storage,Azcopy,我正在尝试将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来处理?