使用AzCopy C#复制Blob容器报错:未知命令问题求助
问题:AzCopy执行时提示“unknown command”错误,复制Blob容器失败
我在使用AzCopy将Blob容器从一个存储账户复制到另一个时遇到了问题,启动进程时出现以下错误:
Error: unknown command "/Source:https://pslfilestore.blob.core.windows.net/downloads" for "azcopy"
Run 'azcopy --help' for usage.
System.IO.StreamWriterdownloads unknown command "/Source:https://pslfilestore.blob.core.windows.net/downloads" for "azcopy "
我的代码如下:
foreach (CloudBlobContainer items in containers) { var AzCopyProcess = new Process(); AzCopyProcess.StartInfo.UseShellExecute = false; AzCopyProcess.StartInfo.RedirectStandardOutput = true; AzCopyProcess.StartInfo.FileName = strCommand; //pass storage account name, container and the key AzCopyProcess.StartInfo.Arguments = $"/Source:https://{storageAccountName}.blob.core.windows.net/{items.Name} /Dest:{dayBlob.Uri}/{storageAccountName}/{items.Name} /SourceKey:{accountKey.ToString()} /DestKey:{pslFileStoreBackUpKey.ToString()} /S"; AzCopyProcess.Start(); StreamWriter stdOut = new StreamWriter(Console.OpenStandardOutput()); stdOut.AutoFlush = true; Console.Write(stdOut); var output = AzCopyProcess.StandardOutput.ReadToEnd(); Console.WriteLine($"{items.Name} {output}"); }
请问该问题的原因是什么?
原因分析与解决方案
这个错误的核心原因是你使用了旧版AzCopy的参数格式,但当前运行的是新版AzCopy(v10+),两者的语法完全不兼容:
- 旧版AzCopy(v8及更早)采用
/参数名:值的参数式语法,比如/Source:... /Dest:... - 新版AzCopy(v10+)采用命令式语法,必须先指定操作命令(比如
copy),然后用--参数名 值的格式传递参数
你的代码里用了/Source:...这种旧格式,新版AzCopy会把开头的/Source:...当成一个未知命令,所以抛出了"unknown command"的错误。
修正后的代码
把Arguments部分改成新版AzCopy的语法即可,具体调整如下:
foreach (CloudBlobContainer items in containers) { var AzCopyProcess = new Process(); AzCopyProcess.StartInfo.UseShellExecute = false; AzCopyProcess.StartInfo.RedirectStandardOutput = true; // 确保strCommand是"azcopy"(新版可执行文件名,旧版是AzCopy.exe) AzCopyProcess.StartInfo.FileName = strCommand; // 改用新版AzCopy的copy命令语法 AzCopyProcess.StartInfo.Arguments = $"copy \"https://{storageAccountName}.blob.core.windows.net/{items.Name}\" \"{dayBlob.Uri}/{storageAccountName}/{items.Name}\" --source-key \"{accountKey}\" --destination-key \"{pslFileStoreBackUpKey}\" --recursive"; AzCopyProcess.Start(); var output = AzCopyProcess.StandardOutput.ReadToEnd(); Console.WriteLine($"{items.Name} {output}"); }
关键调整点说明
- 添加
copy命令:这是新版AzCopy执行复制操作的必需前缀,告诉AzCopy你要执行的是复制任务 - 参数格式替换:
/Source:→ 直接作为第一个位置参数(源路径)/Dest:→ 直接作为第二个位置参数(目标路径)/SourceKey:→--source-key/DestKey:→--destination-key/S→--recursive(递归复制子目录/Blob)
- 路径包裹双引号:避免路径中出现特殊字符时导致参数解析错误
- 确认AzCopy版本:确保
strCommand指向的是新版AzCopy(可执行文件名为azcopy,旧版是AzCopy.exe)
如果需要验证语法,你可以先在命令行手动执行类似的命令,确认能正常运行后再放到代码里:
azcopy copy "https://pslfilestore.blob.core.windows.net/downloads" "目标路径" --source-key "源账户密钥" --destination-key "目标账户密钥" --recursive
内容的提问来源于stack exchange,提问作者Craig Gallagher
相关产品推荐
相关产品推荐

