【问题标题】:Unable to run azcopy tool with c#无法使用 c# 运行 azcopy 工具
【发布时间】:2021-11-03 15:25:30
【问题描述】:

我编写了一个控制台应用程序以编程方式调用 AZcopy 工具,但我无法调用 azcopy 工具。你能把可行的来源重定向给我吗?我已经下载了 azcopy_windows_amd64_10.12.1 并将 azcopy.exe 放入 C:\Windows\System32\azcopy.exe 位置

static void Main(string[] args)
    {
        string strCmdText = @"AzCopy.exe sync ""D:\temp"" ""https://myhubforazcopy.blob.core.windows.net/myhubforazcopy1?sp=racwdl&st=2021-09-05T17:19:11Z&se=2021-09-06T01:19:11Z&spr=https&sv=2020-08-04&sr=c&sig=MAraJ0PxqJMDdYuWzrOUEwYda%2BkXEukP%2Fs%3D"" --destination-delete=true";
       
        CallProcess(strCmdText);
    }

public static void CallProcess(string strCmdText)
    {
       
        //C:\Windows\System32\azcopy.exe
        var process = new Process();
        ProcessStartInfo startInfo = new ProcessStartInfo
        {
            FileName = @"C:\Windows\System32\cmd.exe",
            RedirectStandardInput = true,
            RedirectStandardOutput = true,
            Arguments = strCmdText,
            UseShellExecute = false,
            CreateNoWindow = false,
            WorkingDirectory = @"D:\AzCopy\bin\Debug\"
        };


        process.StartInfo = startInfo;

        process.Start();

        process.StandardInput.Flush();
        process.StandardInput.Close();
        process.WaitForExit();
        Console.WriteLine(process.StandardOutput.ReadToEnd());
    }

【问题讨论】:

  • 为什么要启动一个 shell,然后才运行 AzCopy?为什么不直接启动 Azcopy?
  • 我想以编程方式执行上述命令

标签: c# cmd azure-blob-storage azcopy


【解决方案1】:

从您要执行的程序开始cmd,因为参数实际上并不会运行该程序,您需要在/c 标志之后传递整个参数(您的程序),如下所示:

string strCmdText = @"/c AzCopy.exe sync ""D:\temp"" ...

确保AzCopy 在您的PATH 中或指定它的精确路径

但如果您直接运行 AzCopy 而不是启动命令提示符然后启动 AzCopy 会更好,如下所示:

// Notice how the 'azcopy' at the start is gone
var arguments = @"""D:\temp"" ""https://myhubforazcopy.blob ..."

var process = new Process();
ProcessStartInfo startInfo = new ProcessStartInfo
{
    FileName = @"C:\Windows\System32\azcopy.exe",
    RedirectStandardInput = true,
    RedirectStandardOutput = true,
    Arguments = arguments,
    UseShellExecute = false,
    CreateNoWindow = false,
    WorkingDirectory = @"D:\AzCopy\bin\Debug\"
};

【讨论】:

  • 现在它在抱怨 process.Start();该系统找不到指定的文件。 “确保 AzCopy 在您的 PATH 中或指定它的精确路径”是什么意思?
  • 如果环境知道它在哪里,你只能启动一个程序(一个进程),要知道它在哪里,系统在名为PATH的环境变量中查找,你可以阅读更多内容@987654321 @,您可以按照here 的说明编辑它们。如果你不想编辑你的路径变量,那么你可以简单地指定确切的路径作为文件名,所以不要只使用azcopy 使用C:\Windows\System32\azcopy.exe
  • 感谢您的帮助,现在我可以很好地运行 azcopy 实用程序了。但是还有一个问题是,如果我要更改我的源文件夹,那么人们过去常来这里会不会有什么问题joymonscode.blogspot.com/2017/10/…
【解决方案2】:

解决方案:

static void Main(string[] args)
    {
        string strCmdText = @"/c azcopy.exe sync ""D:\temp"" ""https://myhubforazcopy.blob.core.windows.net/myhubforazcopy1?sp=racwdl&st=2021-09-05T17:19:11Z&se=2021-09-06T01:19:11Z&spr=https&sv=2020-08-04&sr=c&sig=MAraJ0PxqJMDdYuWzrOUEwYda%2BkXEukP%2Fs%3D"" --delete-destination=true";
        
        CallProcess(strCmdText);
    }

 public static void CallProcess(string strCmdText)
    {
        var process = new Process();
        ProcessStartInfo startInfo = new ProcessStartInfo
        {
            FileName = @"cmd.exe",
            RedirectStandardInput = true,
            RedirectStandardOutput = true,
            Arguments = strCmdText,
            UseShellExecute = false,
            CreateNoWindow = false,
            WorkingDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
        };


        process.StartInfo = startInfo;

        process.Start();

        process.StandardInput.Flush();
        process.StandardInput.Close();
        process.WaitForExit();
        Console.WriteLine(process.StandardOutput.ReadToEnd());
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    相关资源
    最近更新 更多