标签: processstartinfo

WorkingDirectory的System.Diagnostics.Process问题

我正在使用第三方软件工具(命令行工具)将PDF文件合并在一起.使用C#我试图用来System.Diagnostics.Process运行可执行文件,但我想出了一些错误,具体取决于参数设置.

  • 如果UseShellExecute = trueRedirectStandardOutput = true我得到:
    • Process对象必须将UseShellExecute属性设置为false以重定向IO流.
  • 如果UseShellExecute = trueRedirectStandardOutput = false我得到:
    • 该系统找不到指定的文件
  • 如果useShellExecute = falseRedirectStandardOutput = true我得到:
    • 该系统找不到指定的文件
  • 如果UseShellExecute = falseRedirectStandardOutput = false我得到:
    • 该系统找不到指定的文件

正在运行的代码如下:

Process p = new Process();

p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = false;
p.StartInfo.WorkingDirectory = "C:\\Program Files (x86)\\VeryPDF PDF Split-Merge v3.0";
p.StartInfo.FileName = "pdfpg.exe " + strFileNames.Trim() + " " 
                       + D2P_Folder_Converted + "\\" …
Run Code Online (Sandbox Code Playgroud)

system.diagnostics process processstartinfo

3
推荐指数
1
解决办法
8537
查看次数

如何在 C# 中将“<”(输入重定向)与 ProcessStartInfo 一起使用?

我有以下几点:

C:\temp\dowork.exe < input.txt
processing.......
complete
C:\
Run Code Online (Sandbox Code Playgroud)

我试试这个:

processArguments = " < input.txt";
pathToExe = "C:\\temp\dowork.exe";
startInfo = new ProcessStartInfo
                {
                     FileName = pathToExe,
                     UseShellExecute = false,
                     WorkingDirectory = FilepathHelper.GetFolderFromFullPath(pathToExe),
                     Arguments = processArguments
                };

try
 {
    using (_proc = Process.Start(startInfo))
     _proc.WaitForExit();
 }
catch (Exception e)
  {
    Console.WriteLine(e);
}
Run Code Online (Sandbox Code Playgroud)

并且在调用 Start() 后我的 dowork.exe 崩溃了。

有什么建议?

发布问题更新。

感谢大家的投入。我使用 amit_g 的回答解决了这个问题。非常感谢 Phil 展示了可能最好的方法(虽然我没有测试它,但我明白为什么它更好)。以下是我的完整解决方案。随意复制和修改您自己的问题。

1)创建一个控制台应用项目,添加这个类

internal class DoWork
{
    private static void Main(string[] args)
    {
        var fs = new FileStream("C:\\temp\\output.txt", FileMode.Create, FileAccess.ReadWrite, FileShare.None);

        var …
Run Code Online (Sandbox Code Playgroud)

c# processstartinfo command-line-arguments

3
推荐指数
2
解决办法
4636
查看次数

防止子进程在c#中显示shell窗口

我正在使用ffmpeg编译视频,我想阻止它在执行操作时显示控制台.

这是我开始ffmpeg的方式:

ProcessStartInfo si = new ProcessStartInfo();
si.Arguments = string.Format("-y -loop 1 -t " + DucationToString(frameDuration) + " -r 25 -f image2 -i \"{0}\" \"{1}\"",
                             item.Value, otpt);
si.FileName = "ffmpeg";
si.UseShellExecute = false;

Process.Start(si).WaitForExit();
Run Code Online (Sandbox Code Playgroud)

无论我尝试的设置如何ProcessStartInfo,控制台总会出现.

如何在创建子进程时阻止显示控制台?

c# windows process processstartinfo

3
推荐指数
1
解决办法
1583
查看次数

如何获得构建/重建实时输出

我正在创建Visual Studio包,我启动devenv.exe并尝试构建其他解决方案.我需要实时构建输出,因此用户可以看到建立进度(输出),但我不知道如何做到这一点如果它甚至可能.

我试过这样的方式:

            string rebuildLog = string.Empty;
            string logFileName = System.IO.Path.GetTempFileName();

            System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo();
            psi.FileName = @"devenv.exe";
            psi.Arguments = "\"" + config.DmsPath + "\"" + @" /rebuild" + " Release|x64 " +" /out " + logFileName;

            System.Diagnostics.Process process = new System.Diagnostics.Process();
            process.StartInfo = psi;
            process.StartInfo.RedirectStandardOutput = true;
            process.StartInfo.UseShellExecute = false;

            process.Start();

            while (!process.StandardOutput.EndOfStream)
            {
                string line = process.StandardOutput.ReadLine();
                MessageBox.Show(line); // just to see if it works. It should go to log form
            }


            rebuildLog = GetRebuildLog(logFileName);
Run Code Online (Sandbox Code Playgroud)

而且rebuildLog有输出.

有人可以帮忙吗?

c# processstartinfo vspackage visual-studio

3
推荐指数
1
解决办法
1268
查看次数

你如何运行一个你不知道参数开始的程序?

主题并没有说太多,因为在一行中提出问题并不容易.我必须执行一些我从注册表中读取的程序.我必须从有人保存整个路径和参数的字段中读取.
我一直在使用System.Diagnostics.ProcessStartInfo设置程序的名称及其参数,但我发现了各种各样的参数,我必须解析这些参数以将进程可执行文件保存在一个字段中,将其参数保存在另一个字段中.

有没有办法按原样执行整个字符串?

.net c# registry system.diagnostics processstartinfo

2
推荐指数
1
解决办法
522
查看次数

从控制台应用程序发送输入/获取输出(C#/ WinForms)

我有一个包含3个控件的表单:

  1. 用户输入命令以发送到控制台应用程序的文本框,
  2. 用于确认要发送的命令的按钮
  3. 一个只读文本框,用于显示应用程序的输出.

我想要的是让用户在第一个文本框中输入命令,按下按钮以通过第二个文本框输入和接收反馈.

我知道如何使用ProcessStartInfo.RedirectStandardOutput,但是,当我使用时,应用程序挂起StandardOutput.ReadToEnd().

我看了一下异步Process.BeginOutputReadLine()但是,即使我的应用程序没有挂起,不知何故我在文本框中没有得到任何响应,它什么也没做.

这是我的代码:

public partial class MainForm : Form
{

    private void MainForm_Load(object sender, EventArgs e)
    {
        InitializeInterpreter();
    }

    private void InitializeInterpreter()
    {
        InterProc.StartInfo.UseShellExecute = false;
        InterProc.StartInfo.FileName = "app.exe";
        InterProc.StartInfo.RedirectStandardInput = true;
        InterProc.StartInfo.RedirectStandardOutput = true;
        InterProc.StartInfo.RedirectStandardError = true;
        InterProc.StartInfo.CreateNoWindow = true;
        InterProc.OutputDataReceived += new DataReceivedEventHandler(InterProcOutputHandler);

        InterProc.Start();
    }

    private static void InterProcOutputHandler(object sendingProcess, DataReceivedEventArgs outLine)
    {
        if (!String.IsNullOrEmpty(outLine.Data))
        {
           OutputTextBox.Append(Environment.NewLine + outLine.Data);
        }
    }

    private void Enterbutton_Click(object sender, EventArgs e) …
Run Code Online (Sandbox Code Playgroud)

c# processstartinfo redirectstandardoutput

2
推荐指数
2
解决办法
2万
查看次数

如何使用C#在python中将字符串作为命令行参数传递

我尝试将字符串作为命令行参数发送到我的python脚本,如下所示:

var cmdToBeExecute = Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location) + "\\myScript.py";
            var start = new ProcessStartInfo
            {
                FileName = "C:\\Python27\\python.exe",
                Arguments = string.Format("{0} {1}", cmdToBeExecute, "Rahul done good"),
                UseShellExecute = false,
                RedirectStandardOutput = true,
                CreateNoWindow = true
            };
Run Code Online (Sandbox Code Playgroud)

我试着读取命令行参数并在python中显示为:

import sys
print sys.argv[1]
Run Code Online (Sandbox Code Playgroud)

但是,我只得到第一个单词"Rahul"作为输出.请帮我把string作为命令参数参数发送到我的python脚本.

c# python processstartinfo command-line-arguments python-2.7

2
推荐指数
1
解决办法
1234
查看次数

是否必须将空间分配给ProcessStartInfo?

我正在将C++代码移植到C#,我在C++代码中遇到了这个问题,

SHELLEXECUTEINFO shell;
memset(&shell, 0, sizeof(shell));
//the properties in shell are set
ShellExecuteEx(&shell);
Run Code Online (Sandbox Code Playgroud)

所以,现在我使用Process.Start(),并ProcessStartInfo为C#代码.ProcessStartInfo当我调用ProcessStartInfo构造函数时,是否必须为内存分配内存?只是为了满足我的好奇心,这种memset在C++ 中使用的方式是一种非托管语言的练习还是我理解错误的东西?

谢谢.

c# memory-management managed processstartinfo

2
推荐指数
1
解决办法
88
查看次数

处理WaitForExit不等待

我创建了Print spooler应用程序来异步打印pdf.

(应用程序使用veryPDF命令从网络打印机打印)

这是Code

   var procStartInfo = new System.Diagnostics.ProcessStartInfo("cmd", " /c" + "E:\pdfprint_cmd\pdfprint.exe -$ 388444444448350FA394 E:\PrintSpoolerApplication\PrintSpoolerApplication\bin\Debug\45940.pdf");
   procStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
   procStartInfo.Verb = "runas";
   procStartInfo.UseShellExecute = false;
   procStartInfo.CreateNoWindow = true;
   var proc = new System.Diagnostics.Process();
   proc.StartInfo = procStartInfo;
   proc.Start();
   proc.WaitForExit();

// Some stuff
Run Code Online (Sandbox Code Playgroud)

但它没有等待WaitForExit代码.即使我的文档在打印机队列中,它也执行了(这里//某些东西).

打印完成后是否还有其他通知方式?

.net c# printing process processstartinfo

2
推荐指数
1
解决办法
3407
查看次数

C#启动一个新的MailTo进程和HTML URL编码

我为Process类创建了一个新的MailTo扩展方法,它只是用一个包含所需mailto参数的新ProcessStartinfo填充Process.我已经创建了一个名为FormatMailToArgument的方法(在最后),它将控制字符转换为它们的Url编码等价物并测试了它并且它可以工作但是有更好的方法吗?

/// <summary>
/// <see cref="Process"/> extension methods.
/// </summary>
public static class Processes
{
    #region MailTo

    /// <summary>
    /// Populates the process with mailto <see cref="ProcessStartInfo"/>. You may leave any
    /// argument as <c>null</c> if not needed.
    /// </summary>
    /// <param name="process">The process.</param>
    /// <param name="mailMessage">The mail message.</param>
    public static void MailTo(this Process process, MailMessage mailMessage)
    {
        MailTo(
            process,
            mailMessage.To.ToDelimetedString(),
            mailMessage.CC.ToDelimetedString(),
            mailMessage.Bcc.ToDelimetedString(),
            mailMessage.Subject,
            mailMessage.Body);
    }

    /// <summary>
    /// Populates the process with mailto <see cref="ProcessStartInfo"/>. You may leave any …
Run Code Online (Sandbox Code Playgroud)

c# mailto process processstartinfo url-encoding

1
推荐指数
1
解决办法
1万
查看次数

如何使用 C# 中的 ProcessStartInfo 启动名称包含逗号的文件夹?

我有一个应用程序,可以在数据库中查询用于任务的嵌套文件夹的位置,然后打开此文件夹(使用类ProcessStartInfo来启动explorer.exe并将文件夹名称作为参数传递)。

除了许多包含逗号的文件夹之外,这工作正常(不幸的是,它们有很多!)

假设,对于名为 的文件夹C:\this,folder\,它会尝试启动“文件夹”。我怎样才能让它逐字对待逗号?

示例代码:

public void LaunchExplorer() {
        ProcessStartInfo explorer = new ProcessStartInfo();             

        string windir = Environment.GetEnvironmentVariable("WINDIR");
        System.Diagnostics.Process prc = new System.Diagnostics.Process();
        prc.StartInfo.FileName = windir + @"\explorer.exe ";
        prc.StartInfo.Arguments = @"c:\this,folder";
        prc.StartInfo.UseShellExecute = false;

        try                                       
        {                
            prc.Start();
        }

        catch
        {
            MessageBox.Show("cannot open folder " + prc.StartInfo.Arguments);
        }
}
Run Code Online (Sandbox Code Playgroud)

c# explorer processstartinfo

0
推荐指数
1
解决办法
1618
查看次数

如何强制ANYCPU .net应用程序以32位或64位运行?

我有一个Office Addin.当需要在HKLM中设置许可证密钥时,它会使用runas = admin启动应用程序.Office 2007 Office是32位的.但Office 2010有32位或64位版本.该版本确定HKLM密钥是否为WoW或note.

因此,我需要以与Office(和我的AddIn)匹配的位数启动应用程序.我怎样才能做到这一点?

或者在替代方案中,如何在64位模式下运行WoW注册表和在WoW中运行时访问64位(常规)注册表?

我在.NET 3.5上.

谢谢 - 戴夫

.net registry processstartinfo

0
推荐指数
1
解决办法
1693
查看次数

如何使用process.start将命令行参数传递给.exe文件(例如静默模式)

我在这个应用程序中有一个vb.net Windows应用程序,我想在静默模式下运行另一个exe文件,为此我首先在命令行中运行此exe文件它正在工作.但我不知道如何通过这些参数通过vb.coding process.start.

通过命令行我有这样的传递. D:\ myapps> sample.exe/s/v/qn (正常工作)

但通过编码,我已经通过这样的传递

 Directory.SetCurrentDirectory(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location))
        Dim info As New System.Diagnostics.ProcessStartInfo
        info.FileName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\sample.exe"
        info.Arguments = "/s /v/qn"
        Dim process As New System.Diagnostics.Process
        process.StartInfo = info
        process.Start()
        MessageBox.Show(info.Arguments.ToString())
        process.Close()
Run Code Online (Sandbox Code Playgroud)

这不行,这段代码有什么问题请帮帮我..

vb.net processstartinfo commandargument

0
推荐指数
1
解决办法
2万
查看次数