当我在调用使用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;
答案 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)
答案 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
中的独立命令行应用:只需直接执行即可。