文件复制从 aspnet 网络表单开始并使用批处理、pstools 和 robocopy 实现不起作用



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

我想从 sql1 复制数据库备份到 sql2 sql3 (取决于参数),按按钮单击<< iis

我为此写了一个按钮单击方法,该方法调用位于 iis> iis

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

批次使用 pstools 运行 Robocopy on SQL1 应该将所需的文件复制到目标服务器( 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:WindowsSystem32cmd.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:qatoolspstoolspsexec64.exe -accepteula -u Administrator -p myPassword \SourceIP robocopy \SourceIPqadb_backup \%2qadb_backup %1 /is

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

根据以下建议更新的代码

我的猜测是,您从未执行过作为IIS服务像以前运行的用户的PSTools,因此EULA对话框正在阻止您的执行。

如果您还记得,您总是有一个窗口,并且需要在第一次运行任何Sysinternals工具(如PSTools)时按Accept按钮。

我想这应该对您有用:

c:qatoolspstoolspsexec64.exe -accepteula -u Administrator -p myPassword \SourceIP robocopy \SourceIPqadb_backup \%2qadb_backup %1 /is

[编辑]您很可能以后会遇到这个问题,无论如何它对您无效,因此我必须列出您的代码还有什么问题:

  • 启动.bat文件需要CMD.EXE作为母亲进程,您不能直接启动.bat文件作为过程。相反,您可以使用另一种方法以外的方法以外的processstartinfo,该方法会自动产生默认脚本解释器:在C#

  • 中执行批处理文件
  • 执行批处理文件的过程是" cmd.exe",第一个参数"/c",第二个参数您要执行的批处理文件

  • 执行典型的命令行工具时,您可以考虑读取您正在执行的过程的SDTOUT(标准输出),例如:从.NET应用程序(C#)捕获控制台输出

最新更新