我有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#)捕获控制台输出