0

我正在尝试以编程方式运行一系列命令,读取错误代码,并检测这些代码是否指示成功或失败,以便我可以做出相应的响应。

目前我的命令正在使用 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
4

2 回答 2

0

你不是已经回答了你自己的问题吗?您必须将错误代码与每个实用程序的成功或失败相匹配。commandProcess.StartInfo.FileName将告诉您启动的实用程序是robocopy还是PSExe. 解析错误代码时,根据文件名将值映射为成功或失败。

于 2010-07-07T18:32:08.383 回答
0

我做大型数据库的备份,所以有一个命令文件.cmd。因为我有 mny Start ROBOCOPY 课程目标并为 a* b* c* c* 等的每个进程脚本行提供参数。示例如下:在 sample.cmd 文件(充当 btach 文件)中,我在 a 中有以下脚本行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 开始按照上述命令同时复制文件时,它等待另一个文件,因为它有等待时间,如果文件正在被另一个使用过程。Is 更快,因为它同时工作。

现在我正在使用 C# windows 开发 GUI 来运行进程,而不是转到命令控制台并启动

主要的()

{

process.start("sample.cmd 路径")

process.waitforexit()

label.text="复制成功"

}

但是,如果它控制一个进程,即 cmd.exe 并且任务管理器中有 4 个 robocopy 进程。当 cmd.exe 进程完成时,它会将光标返回到 label.text “成功完成”。虽然仍有 robocopy 进程仍在运行。您可以看到 robocopy 窗口正在执行复制过程。

问题是:我想在 C# 中以编程方式控制所有进程(cmd.exe 和 robocopy.exe),以便 label.text 仅在所有命令都成功完成时才显示“成功完成”,如果一个失败了,那么GUI中就没有意义了。

选项2(类似于Biju上面写的):最好从sample.cmd(批处理文件)文件中删除robocoy命令脚本并编写代码以在C#中运行4 robocopy行,但是如何运行编写的robocooy脚本行。 cmd 文件,因为它们也有参数。我的代码运行每个 robocopy 进程,然后每个进程都将返回到下一行代码,如果失败,我们可以捕获错误并显示在消息框中。

希望这会有所帮助......但是,如果有人可以改进的话,我正在寻找更好的方法。谢谢 :)

于 2013-09-03T07:07:13.347 回答