Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XCopy不适用于UseShellExecute=false_C#_Batch File_Xcopy - Fatal编程技术网

C# XCopy不适用于UseShellExecute=false

C# XCopy不适用于UseShellExecute=false,c#,batch-file,xcopy,C#,Batch File,Xcopy,我正在尝试使用System.Diagnostics.Process从.net/c运行批处理文件。不知何故,它不执行批处理文件的xcopy命令 批处理文件示例: #copy test to test2 including sub directories xcopy c:\test\ c:\test2 C#代码: 如果我将UseShellExecute更改为true,则它可以工作,但似乎无法捕获标准输出 有人遇到过这样的问题吗?我已经测试了您的精确代码,似乎能够很好地接收数据。但是,由于读取是异

我正在尝试使用System.Diagnostics.Process从.net/c运行批处理文件。不知何故,它不执行批处理文件的xcopy命令

批处理文件示例:

#copy test to test2 including sub directories
xcopy c:\test\ c:\test2 
C#代码:

如果我将UseShellExecute更改为true,则它可以工作,但似乎无法捕获标准输出


有人遇到过这样的问题吗?

我已经测试了您的精确代码,似乎能够很好地接收数据。但是,由于读取是异步进行的,
WaitForExit(…)
可以在读取所有数据之前返回。传递给
OutputDataReceivedEventArgs
事件处理程序的
DataReceivedEventArgs
属性为空,表明数据结束


还值得注意的是,如果
xcopy
请求用户输入(例如,如果目标中存在同名文件),则似乎不会返回任何数据。您可能希望在批处理文件中检查这一点,或者处理标准错误流中的数据。

我已经测试了您的确切代码,似乎能够很好地接收数据。但是,由于读取是异步进行的,
WaitForExit(…)
可以在读取所有数据之前返回。传递给
OutputDataReceivedEventArgs
事件处理程序的
DataReceivedEventArgs
属性为空,表明数据结束


还值得注意的是,如果
xcopy
请求用户输入(例如,如果目标中存在同名文件),则似乎不会返回任何数据。您可能希望在批处理文件中检查这一点,或者处理标准错误流中的数据。

XCopy是特殊的。如果只重定向其输出,它将无法正常工作。您还必须重定向输入。您好,重定向标准输入解决了问题。非常感谢:)事实证明,在我们的情况下,重定向STDIN也是解决这个问题的办法。如果不重定向STDIN,xcopy将返回在STDERR上找不到的文件,这毫无意义。所有其他标准实用程序似乎都运行良好。汉斯-也许可以单独回答这个问题?XCopy很特别。如果只重定向其输出,它将无法正常工作。您还必须重定向输入。您好,重定向标准输入解决了问题。非常感谢:)事实证明,在我们的情况下,重定向STDIN也是解决这个问题的办法。如果不重定向STDIN,xcopy将返回在STDERR上找不到的文件,这毫无意义。所有其他标准实用程序似乎都运行良好。汉斯-也许可以单独回答这个问题?
    public void RunMSIBatchFile(string _workingDirectory, string batchFileName)
    {
        var process = new Process
        {
            StartInfo =
            {

                UseShellExecute = false,
                RedirectStandardOutput = true,
                WorkingDirectory = _workingDirectory,
                FileName = _workingDirectory + batchFileName,
                CreateNoWindow = true,
                RedirectStandardError = true
            }
        };

        process.OutputDataReceived += ProcessOutputDataReceived;
        process.Start();
        process.BeginOutputReadLine();
        process.WaitForExit(Convert.ToInt32(CommandTimeOut.TotalMilliseconds));
    }