为什么在从批处理脚本重定向输出时,我在C#中获得不同的退出代码?

时间:2011-11-23 19:10:16

标签: c# process redirectstandardoutput

当我在调用使用FC比较两个文件的批处理脚本时重定向standardOutput时,与不重定向输出时相比,我获得了不同的输出。有什么问题?

此代码将“0”打印到我的记录窗口:

Process test = new Process();
test.StartInfo.FileName = "cmd.exe";
test.StartInfo.Arguments = @"/c fc /b /a C:\temp\debug\1.txt C:\temp\debug\2.txt";
//test.StartInfo.RedirectStandardError = true;
//test.StartInfo.RedirectStandardOutput = true;
test.StartInfo.UseShellExecute = false;
test.StartInfo.CreateNoWindow = true;
test.Start();
test.WaitForExit();
printLog(test.ExitCode.ToString());
return;

此代码将“-1”打印到我的记录窗口:

Process test = new Process();
test.StartInfo.FileName = "cmd.exe";
test.StartInfo.Arguments = @"/c fc /b /a C:\temp\debug\1.txt C:\temp\debug\2.txt";
test.StartInfo.RedirectStandardError = true;
test.StartInfo.RedirectStandardOutput = true;
test.StartInfo.UseShellExecute = false;
test.StartInfo.CreateNoWindow = true;
test.Start();
test.WaitForExit();
printLog(test.ExitCode.ToString());
return;

4 个答案:

答案 0 :(得分:4)

我解决了。

我需要将标准输入与标准错误和标准输出重定向。这段代码给出了0作为退出代码:

Process test = new Process();
test.StartInfo.FileName = "fc.exe";
test.StartInfo.Arguments = @"/b /a C:\temp\debug\1.txt C:\temp\debug\2.txt";
test.StartInfo.RedirectStandardError = true;
test.StartInfo.RedirectStandardOutput = true;
test.StartInfo.RedirectStandardInput = true;
test.StartInfo.UseShellExecute = false;
test.StartInfo.CreateNoWindow = true;
test.Start();
test.WaitForExit();
printLog(test.ExitCode.ToString());
return;

如果你在cmd bash中编写FC w / o参数,你将得到-1作为退出代码。

答案 1 :(得分:0)

-1 somtimes意味着发生了不好的事情。你确定重定向效果很好吗?也许FC无法执行正常的文件比较操作而失败了?

答案 2 :(得分:0)

返回的0表示成功,其他任何事情通常都是失败的。但是在这个程序中出现以下情况:

  

对于FC,FC的返回代码(ERRORLEVEL)似乎为0,1为   不同,2为文件不存在。

Link to Source

答案 3 :(得分:0)

适合我。我有一个愚蠢的命令行应用程序,setcc.exe除了将条件代码(退出代码)设置为指定值之外什么都不做:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace setCC
{
    class Program
    {
        static int Main( string[] args )
        {
            if ( args.Length == 0 ) throw new ArgumentException( "Required Argument is missing" ) ;
            int  cc      ;
            bool isValid = int.TryParse( args[0] , out cc ) ;
            if ( !isValid ) throw new ArgumentException( "Required parameter is not a valid number") ;
            return cc ;
        }
    }
}

所以运行命令:

`setcc 17`

将条件代码(退出代码,错误级别)设置为17(正如您所料)。

使用它作为我的子进程(以及您的示例代码)我编写了这个测试工具:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
namespace testHarness
{
    class Program
    {
        static void Main( string[] args )
        {
            IEnumerable<bool> Redirections = new bool[]{ false , true } ;
            foreach ( bool redirecting in Redirections )
            {
                int cc ;
                using ( Process test = new Process() )
                {
                    test.StartInfo.FileName               = "cmd.exe"       ;
                    test.StartInfo.Arguments              = @"/c setcc 17 " ;
                    test.StartInfo.RedirectStandardError  = redirecting     ;
                    test.StartInfo.RedirectStandardOutput = redirecting     ;
                    test.StartInfo.UseShellExecute        = false           ;
                    test.StartInfo.CreateNoWindow         = true            ;
                    test.Start()  ;
                    test.WaitForExit() ;
                    cc = test.ExitCode ;
                }
                Console.WriteLine( "Redirecting:{0}, cc is {1}" , redirecting , cc ) ;
            }
            return ;
        }
    }
}

除了连续执行setcc 17两次,一次关闭重定向,一次启用重定向时,它什么都不做。

我得到了我期望看到的输出:

Redirecting:False, cc is 17
Redirecting:True, cc is 17

我要查看fc正在回传的价值。如果在命令shell窗口中运行相同的fc命令,您会得到什么,如下所示?

c:\> fc /b /a C:\temp\debug\1.txt C:\temp\debug\2.txt
c:\> echo %ERRORLEVEL%

我也想知道为什么你在命令shell(fc)中运行cmd.exe并产生两个进程而不是一个进程。 fc.exe只是c:\windows\system32中的独立命令行应用:只需直接执行即可。