Process.Start() 啥都不做

Posted

技术标签:

【中文标题】Process.Start() 啥都不做【英文标题】:Process.Start() does nothingProcess.Start() 什么都不做 【发布时间】:2014-05-11 21:36:43 【问题描述】:

我必须通过代码启动 *** 连接 (Fortinet)。 我有一个建立连接的 cmd 文件。 如果我在 shell 上调用 cmd 文件,它工作得很好。 当我通过 Process.Start 调用它时,它什么也不做。 它没有抛出任何异常,它似乎执行但***没有连接。

在标准输出上,我可以读取我放在 cmd 文件中的回显(因此它正在执行正确的文件)。 我启动了 ping -d 来查看 *** 何时启动,当我通过 shell 调用它时,它会在几秒钟内启动,而通过 C# 则不会。

我也尝试了 sleep(30000) 但没有。

我的 cmd (ConnectFile.cmd):

@echo off
@echo Connecting to ***
"C:\Program Files (x86)\Fortinet\Ssl***Client\FortiSSL***client.exe" connect -s "*** my***"

我的代码(connectFile 和 disconnectFile 是包含 cmd 文件完整路径的字符串):

try

    var startInfo = new System.Diagnostics.ProcessStartInfo();
    startInfo.FileName = connectFile;
    startInfo.WorkingDirectory = System.IO.Path.GetDirectoryName(connectFile) ?? "";
    System.Diagnostics.Process process = System.Diagnostics.Process.Start(startInfo);
    System.Threading.Thread.Sleep(30000);
    base.GetFiles(folder);

finally

    System.Diagnostics.Process.Start(disconnectFile);

【问题讨论】:

“当前目录”是否重要? 为什么UseShellExecute = false; 您预计FortiSSL***client 需要多长时间? (即它是否足够长,所以您会看到 cmd.exe 实例启动)。如果时间不长,请考虑在批处理中延迟,以便确保批处理文件正在运行。总结:找到你可以处理的最简单的部分:批处理文件是否执行? 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。 感谢您编辑标题。 【参考方案1】:

你必须分开参数。 FileName 用于 exe 文件,而不是整个 shell 命令(您明确地说 not 使用 shell)。所以把参数放到ProcessStartInfo中的Arguments属性中。

在你的情况下,参数应该是:

文件名 - C:\Program Files (x86)\Fortinet\Ssl***Client\FortiSSL***client.exe(无引号) 参数 - connect -s "*** my***"(同样,没有引用)

其次,如果您捕获它,则必须读取标准输出。如果输出缓冲区在您读取之前已满,则被调用的进程将停止工作 - 它必须等待缓冲区被清空。如果您确定应用程序实际上会在某个时候完成,只需删除Thread.Sleep 并立即调用ReadToEnd。否则,使用例如。异步读取获取数据。

另外,设置WorkingDirectory 通常是个好主意。即使应用程序需要工作目录中的任何数据,它也更安全,因为只有管理员可以更改 Program Files - 这有助于防止 DLL 注入黑客攻击。

【讨论】:

谢谢,其实我没有任何参数。 “connect -s”参数位于 cmd 文件中。我正在阅读 Tacer.Log 调用中的 StandardOut,但我重定向了 stdout 以尝试调试代码。一开始我只是简单地调用 Process.Start 没有重定向 @WaveMax 哦,您正在尝试启动cmd 文件?为什么你会认为这行得通?除非您使用UseShellExecute,否则您只能启动实际的可执行文件(execom、...) - cmd 文件是 shell 脚本。因此,要么直接调用可执行文件(正如我在回答中所写的那样),要么以 cmd 文件为参数启动程序cmd。请注意,输出重定向会改变应用程序的行为,因此添加例如可能是一个更好的主意。 ` > some.log` 到cmd 文件内的应用程序调用,它将重定向到一个文件,并使用UseShellExecute 我使用 cmd 文件是因为我不想在应用程序内部知道 *** 是如何建立的。所以我委托给一个包含所有所需参数的 cmd 文件(我有其他 ***s 可以使用这种方法正常工作)。我编辑了问题,显示它最初的样子,没有重定向。顺便说一句,我只是尝试使用 StartInfo 中的参数调用 .exe,但它再次不起作用。 @WaveMax 好吧,这很奇怪。错误输出说明了什么? ***软件有自己的日志吗?这个特定的 *** 脚本与那些有效的脚本有何不同?您的 C# 应用程序是否有足够的权限来实际运行 exe? 我的 C# 应用程序以管理员权限运行。其他脚本使用不同的 *** 客户端(Cisco、Windows ***)。 *** Client 的日志什么也没说,StrErr 是空的。

以上是关于Process.Start() 啥都不做的主要内容,如果未能解决你的问题,请参考以下文章

UIViewController presentModalViewController:动画:啥都不做?

iOS UITapGestureRecognizer 啥都不做?

NSWindowController showWindow:nil 啥都不做

NSPersistentContainer, performBackgroundTask, 调用 perform 啥都不做

Solididity HTML 脚本啥都不做

DotNet Pack 啥都不做