Почему я получаю разные коды выхода в C # при перенаправлении вывода из пакетного скрипта? - PullRequest
3 голосов
/ 23 ноября 2011

Когда я перенаправляю standardOutput при вызове пакетного скрипта, сравнивающего два файла с использованием FC, я получаю другой вывод по сравнению с тем, когда я не перенаправляю вывод. Что не так?

Этот код выведет «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 ]

4 голосов
/ 24 ноября 2011

Я решил это.

Мне нужно было перенаправить стандартный ввод вместе со стандартной ошибкой и стандартным выводом. Этот код дает мне 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;

Если вы напишите FC без аргументов в cmd bash, вы получите -1 как код выхода.

0 голосов
/ 23 ноября 2011

Возвращенное значение 0 должно указывать на успех, а все остальное, как правило, является ошибкой.Но, похоже, в этой программе верно следующее:

Коды возврата (ERRORLEVEL) для FC выглядят как 0 для одного, 1 для другого, 2 для файла не существует.

Ссылка на источник

0 голосов
/ 23 ноября 2011

У меня работает.У меня есть глупое приложение командной строки, 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 возвращает.Что вы получите, если вы выполните ту же команду fc в окне командной оболочки, как показано ниже:

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

Мне также интересно, почему вы запускаете fc внутри командной оболочки (cmd.exe)и порождение двух процессов вместо одного.fc.exe - это просто автономное приложение командной строки в c:\windows\system32: просто запустите его напрямую.

0 голосов
/ 23 ноября 2011

-1 иногда означает, что происходит что-то плохое.Вы уверены, что перенаправление работает хорошо?Возможно, FC не может выполнить обычные операции сравнения файлов и не работает?

...