文件复制从aspnet webforms开始,使用批处理,pstools和robocopy实现不起作用

时间:2017-11-24 15:01:00

标签: c# asp.net batch-file psexec robocopy

我有4个独立的服务器(不在域中): IIS,SQL1,SQL2,SQL3

我想将 SQL1 的数据库备份复制到 SQL2 SQL3 (取决于参数),方法是按住 IIS

我为此编写了一个按钮点击方法,该方法调用位于 IIS

上的inetpub文件夹中的批处理文件

批量正在使用 pstools SQL1 上运行 robocopy SQL1 应将所需文件复制到目标服务器(< strong> SQL2 或 SQL3

如果我直接在 IIS (cmd作为管理员)上执行批处理,或者在本地计算机上调试批处理时,此解决方案有效,但如果从运行站点调用它则不会。 它甚至不会在以下几行之间花费任何时间:

        batchProcess.Start();
        batchProcess.WaitForExit();

这是我的复制方法:

private bool ProcessCopy(string file, string destinationIp)
    {
        SecureString password = ConvertToSecureString("myPassword");

        try
        {
            string batchPath = Server.MapPath(".") + "\\CopyFile.bat";
            string cmd = @"c:\Windows\System32\cmd.exe";

            ProcessStartInfo processInfo = new ProcessStartInfo
            {
                FileName = cmd,
                UseShellExecute = false
            };

            Process batchProcess = new Process {StartInfo = processInfo};

            batchProcess.StartInfo.Arguments = $"/C {batchPath} {file} {destinationIp}";
            batchProcess.StartInfo.Domain = "";
            batchProcess.StartInfo.UserName = "Administrator";
            batchProcess.StartInfo.Password = password;
            batchProcess.StartInfo.RedirectStandardOutput = true;
            batchProcess.StartInfo.RedirectStandardError = true;
            batchProcess.StartInfo.CreateNoWindow = true;

            batchProcess.Start();
            batchProcess.WaitForExit();
            string response = batchProcess.StandardOutput.ReadToEnd();
            response += batchProcess.StandardError.ReadToEnd();
            statusStringAppend($"response: {response}");

            return true;
        }
        catch (Exception ex)
        {
            statusStringAppend($"Failed: {ex.Message}. {ex.StackTrace}");
        }
        return false;
    }

批处理正文是:

@echo off
c:\qa\tools\pstools\psexec64.exe -accepteula -u Administrator -p myPassword \\SourceIP robocopy \\SourceIP\qa\db_backup\ \\%2\qa\db_backup\ %1 /is

我的问题是:
1.为什么没有复制文件?
2.有没有更好的方法来复制它?

根据以下建议更新的代码

1 个答案:

答案 0 :(得分:1)

我的猜测是你从未像以前那样以IIS服务运行的用户身份执行pstools,因此EULA对话框阻止了你的执行。

如果你还记得,你总是有一个窗口,并且在第一次运行像pstools这样的sysinternals工具时需要按下接受按钮。

我想这应该适合你:

c:\qa\tools\pstools\psexec64.exe -accepteula -u Administrator -p myPassword \\SourceIP robocopy \\SourceIP\qa\db_backup\ \\%2\qa\db_backup\ %1 /is

[编辑] 你很可能在以后遇到这个问题,无论如何它不适合你,所以我必须列出你的代码还有什么问题:

  • 启动.bat文件需要cmd.exe作为母进程,您不能直接将.bat文件作为进程启动。相反,您可以使用另一种方法而不是ProcessStartInfo自动生成系统默认脚本解释器:Executing Batch File in C#

  • 执行批处理文件的过程是“cmd.exe”,第一个参数“/ C”,第二个参数是您正在执行的批处理文件

  • 执行典型的命令行工具时,您可能会考虑读取正在执行的进程的SDTOUT(标准输出),如下所示:Capturing console output from a .NET application (C#)