我正在尝试以编程方式运行一系列命令,读取错误代码,并检测这些代码是否表示成功或失败,以便我可以做出相应的响应。
目前我的命令正在使用psexec,然后启动robocopy。我注意到,如果程序成功,大多数命令返回错误代码0,robocopy很奇怪,即使操作成功,它也会返回0-8范围内的值,所以我在添加一些额外的逻辑我的错误检测请注意robocopy何时返回错误代码,否则会显示失败。
问题是在同一组命令中我正在使用PSExec来启动各种其他可执行文件和批处理文件,所以我需要一个错误检测解决方案,让我知道robocopy何时返回这些错误代码或者是这是PSExec,因为robocopy中的错误代码5通常很好,而PSExec中的错误代码5表示访问被拒绝。
所以我的问题是,我怎么知道哪个程序返回了错误代码?我正在使用c#.NET 4.0,我正在使用Process类以编程方式启动这些程序。我将程序名称设置为psexec,参数包括robocopy或其他程序。然后我运行,等待退出,并存储错误代码,然后尝试解析它。
你们有什么建议?
以下是代码段:
foreach (var command in commands)
{
// TODO: Add exception handling
string processName = command.Split(delimiters).ToList().ElementAt(0); // split up command into pieces, select first "token" as the process name
string commandArguments = command.Replace(processName + " ", ""); // remove the process name and following whitespace from the command itself, storing it in a new variable
Process commandProcess = new Process(); // declare a new process to be used
commandProcess.StartInfo.FileName = processName; // add file start info for filename to process
commandProcess.StartInfo.Arguments = commandArguments; // add file start info for arguments to process
commandProcess.StartInfo.UseShellExecute = false; // skip permissions request
commandProcess.Start(); // start process according to command's data
commandProcess.WaitForExit(); // wait for the process to exit before continuing
bool commandSuccessful = ParseCommandErrorCode(commandProcess, commandProcess.ExitCode); // grab error code
if (!commandSuccessful)
{
// ERROR! abort operation and inform the user of the last completed operation, and how many commands have not been run
} // end if
Console.WriteLine("Error code: {0}", commandProcess.ExitCode); // print error code
commandProcess.Close(); // close process
} // end foreach
答案 0 :(得分:0)
你还没有回答过自己的问题吗?您必须将错误代码与每个实用程序的成功或失败相匹配。 commandProcess.StartInfo.FileName
会告诉您启动的实用程序是robocopy
还是PSExe
。解析错误代码时,根据文件名将值映射为成功或失败。
答案 1 :(得分:0)
我做大型数据库的备份,所以有一个命令文件.cmd。因为我有mny启动ROBOCOPY cource目的地并为每个进程脚本行参数* b * c * c *等。 示例如下:在sample.cmd文件中(充当btach文件), 我在sample.cmd文件中有以下脚本行:
启动ROBOCOY src dest a * b * c * / z / w:1 r:1
启动ROBOCOY src dest d * e * f * g * / z / w:1 r:1
启动ROBOCOY src dest h * K * P * Y * / z / w:1 r:1
启动ROBOCOY src dest xry * srp * / z / w:1 r:1
当我朗姆酒> Robocopy sample.cmd我开始使用cmd.exe和另外4个多控制台窗口robocoy.exe按照上述命令同时复制文件,它等待另一个文件,因为它有等待时间,如果文件正被另一个进程使用。是因为它同时工作更快。
现在我开始使用C#窗口来运行GUI而不是命令控制台 启动
main()的
{
process.start(“sample.cmd的路径”)
process.waitforexit()
label.text =“成功复制”
}
但是,如果它控制了一个进程,即cmd.exe,并且taskmanager中有4个robocopy进程。当cmd.exe进程完成时,它将光标返回到label.text“Sucesssfully completed”。虽然robocopy进程仍在运行。你可以看到复制过程中的robocopy窗口。
这是一个问题:我想在C#中以编程方式对所有进程(cmd.exe和robocopy.exe)进行控制,以便只有当所有命令都成功完成时,label.text才会显示“成功完成” “,如果一个失败,那么GUI就没有意义了。
选项2(类似于上面写的Biju):从sample.cmd(批处理文件)文件中删除robocoy命令脚本并编写代码以在C#中运行4个robocopy行更好,但是如何运行robocooy脚本行写.cmd文件,因为他们也有参数。我运行每个robocopy进程的代码然后每个将返回到下一行代码,如果失败,我们可以捕获错误并显示在消息框中。
希望这会有所帮助......但是,Iam正在寻找更好的方法,如果有人可以改进的话。谢谢:))