我正在使用第三方软件工具(命令行工具)将PDF文件合并在一起.使用C#我试图用来System.Diagnostics.Process运行可执行文件,但我想出了一些错误,具体取决于参数设置.
UseShellExecute = true和RedirectStandardOutput = true我得到:
UseShellExecute属性设置为false以重定向IO流.UseShellExecute = true和RedirectStandardOutput = false我得到:
useShellExecute = false和RedirectStandardOutput = true我得到:
UseShellExecute = false和RedirectStandardOutput = 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) 我有以下几点:
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) 我正在使用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,控制台总会出现.
如何在创建子进程时阻止显示控制台?
我正在创建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有输出.
有人可以帮忙吗?
主题并没有说太多,因为在一行中提出问题并不容易.我必须执行一些我从注册表中读取的程序.我必须从有人保存整个路径和参数的字段中读取.
我一直在使用System.Diagnostics.ProcessStartInfo设置程序的名称及其参数,但我发现了各种各样的参数,我必须解析这些参数以将进程可执行文件保存在一个字段中,将其参数保存在另一个字段中.
有没有办法按原样执行整个字符串?
我有一个包含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) 我尝试将字符串作为命令行参数发送到我的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
我正在将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++ 中使用的方式是一种非托管语言的练习还是我理解错误的东西?
谢谢.
我创建了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代码.即使我的文档在打印机队列中,它也执行了(这里//某些东西).
打印完成后是否还有其他通知方式?
我为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) 我有一个应用程序,可以在数据库中查询用于任务的嵌套文件夹的位置,然后打开此文件夹(使用类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) 我有一个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上.
谢谢 - 戴夫
我在这个应用程序中有一个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)
这不行,这段代码有什么问题请帮帮我..
processstartinfo ×13
c# ×10
process ×4
.net ×3
registry ×2
explorer ×1
mailto ×1
managed ×1
printing ×1
python ×1
python-2.7 ×1
url-encoding ×1
vb.net ×1
vspackage ×1
windows ×1