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
,否则您只能启动实际的可执行文件(exe
、com
、...) - 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 啥都不做