从我的应用程序中运行批处理文件时出现问题

时间:2019-04-18 17:26:46

标签: c# windows shell command

我一直在尝试创建一个简单的应用程序来备份Windows Server数据库以及整个服务器备份。 为此,我要使用我的应用程序正在执行的批处理文件。 我尝试了几种方法,但是由于某种原因,它总是失败,因此,如果您能帮助我,我会很高兴。

批处理文件BACKUPSERVER:

wbadmin start backup -backupTarget:D: -include:C: -allCritical -quiet

我必须以管理员身份运行bat,否则由于缺少权限而无法运行。

C#代码:

        static Task<int> RunProcessAsync(string fileName)
        {
        ............
        Process p = new Process();

        p.StartInfo.UseShellExecute = false;
        p.StartInfo.RedirectStandardOutput = true;
        p.StartInfo.Verb = "runas";
        p.StartInfo.FileName = "cmd.exe";
        p.StartInfo.Arguments = "/C \"D:\\SQLBACKUP\\BACKUPSERVER.bat\"";
        p.Start();

        string output = p.StandardOutput.ReadToEnd();
        p.WaitForExit();

        }

调试显示“未找到wbadmin”。是否激活“ runas”没有任何作用。

                 ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.FileName = fileName;

        startInfo.RedirectStandardOutput = true;
        startInfo.RedirectStandardError = true;
        startInfo.UseShellExecute = true;
        startInfo.CreateNoWindow = false;
       // startInfo.Verb = "runas";

        var process = new Process

        {

            StartInfo = { FileName = fileName },
            EnableRaisingEvents = true

        };
        process.StartInfo = startInfo;

        process.Exited += (sender, args) =>
        {
            tcs.SetResult(process.ExitCode);
            process.Dispose();
        };

        process.Start();

也不起作用。

有什么想法吗?

编辑: 我可以运行诸如shutdown之类的命令,但是wbadmin根本不起作用...

1 个答案:

答案 0 :(得分:0)

这是我解决问题的方法:

  1. 如果您打算在64位系统上使用您的应用程序,请确保为64位编译,否则它将重定向到其他子文件夹,并且找不到'wbadmin.exe'。

  2. 使用ProcessStart运行wbadmin或运行批处理但不直接输入cmd,因此将其与filename =批处理文件一起使用,或者将wbadmin与startInfo.Arguments一起使用:

        ProcessStartInfo startInfo = new ProcessStartInfo();
    startInfo.FileName = fileName;
    
    startInfo.RedirectStandardOutput = true;
    startInfo.RedirectStandardError = true;
    startInfo.UseShellExecute = true;
    startInfo.CreateNoWindow = false;
    

    // startInfo.Verb =“ runas”;

    var process = new Process
    
    {
    
        StartInfo = { FileName = fileName },
        EnableRaisingEvents = true
    
    };
    process.StartInfo = startInfo;
    
    process.Exited += (sender, args) =>
    {
        tcs.SetResult(process.ExitCode);
        process.Dispose();
    };
    
    process.Start();
    
  3. 确保您请求管理员权限