如何在Mac上使用的Process.Start或同等使用Mono和传递参数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Mac上使用的Process.Start或同等使用Mono和传递参数相关的知识,希望对你有一定的参考价值。

参考技术A 如果我给NeMaC的参数不同,用上述指令会列出所有NeMaC命令执行的信息但是我只想获取其中ture command为还是得到了两个PID值,因为我同时使用了两个NeMaC命令(在不同命令窗口输入)一条是NeMaC -c 30 -m 25000 -r rules.sample 202.101.0.1 private rule1 一条是NeMaC -c 120 -m 25000 -r cs2.rules 202.101.0.1 private rule2 谢谢,另外,NeMaC是NeTraMet这个分析流的工具的一个组件。学习中分成两个脚本执行.请教中,如何用两脚本,要是对应NeMaC有N个进程呢?那又该如何是好换一个思路吧,我如何能得到一个进程的唯一子进程的pid?:?用 ps -C NeMaC -f | grep rule1 | awk 'print $2' 我已经能拿到想要kill的进程的pid了,其值例如为:12815 但是当我执行如下shell文件时确出错了 #!/bin/bash#PATH="$PATH":/home/gwei/myCode#myNeMaC=`ps -C NeMaC -f | grep myNeMaC1 | awk 'print $2'` kill -9 $myNeMaC它显示出来的错误信息是 : arguments must be process or job IDskill: 12815 kill -9 $myNeMaC 也可以杀掉进程,但是把上面这些写入一个.sh文件再执行就出错了怎麼办呢?移植到RH9後提示的错误信息是: [root@gxnunc0504 myCode]# /bin/bash ./killNeMaC1.sh : no such pidsh: line 6: kill: 21820 kill -9 $myNeMaC 上面就是我杀掉进程的教本killNeMaC1,其中echo $myNeMaC确认只剩下一个PID了,可是为什麼到了kill -9 $myNeMaC就运行不下去了呢。相关操作和结果如下:

使用 process.start 后如何退出主程序?

【中文标题】使用 process.start 后如何退出主程序?【英文标题】:how do I exit the main program after using process.start? 【发布时间】:2016-09-28 13:56:32 【问题描述】:

我有一个有效的 vb.net 程序,它简单地使用 process.start(MPC-HC.exe) 自动按顺序播放音乐文件的文本文件列表。一切都很好,除非用户希望在列表未完成时停止播放任何进一步的音乐。

按照建议更新代码后仍有 1 个问题: 因为我希望音乐在没有用户干预的情况下自动播放 - 我需要在每个选择自行完成播放后指定播放器关闭。这可以通过命令行开关“/play /close”来完成。

我该怎么做:

    指定要使用的播放器。 添加命令行开关

在我的原始代码中,我使用了 -

    Dim startInfo As New ProcessStartInfo
    startInfo.FileName = OpenWith
    startInfo.Arguments = f

在哪里

OpenWith = "C:\Program Files\mpc-hc\mpc-hc.exe"
f = vbDoubleQuote + TextLine + vbDoubleQuote + " /play /close"

我如何通过流程完成这些事情?

谢谢,

罗斯

这是更新后的 vb.net 代码以及建议的答案:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    OpenFileDialog1.Title = "Please Select a File"
    OpenFileDialog1.InitialDirectory = "C:\"
    OpenFileDialog1.Filter = "Text Files|*.txt"
    OpenFileDialog1.DefaultExt = "*.txt"
    OpenFileDialog1.FileName = "*.txt"
    OpenFileDialog1.ShowDialog()

    If OpenFileDialog1.CheckFileExists Then
        filePaths = New Queue(Of String)(File.ReadAllLines(OpenFileDialog1.FileName))

        'Execute the first file.
        process = Process.Start(filePaths.Dequeue())
        Process.EnableRaisingEvents = True
    End If

End Sub

Private Sub process_Exited(sender As Object, e As EventArgs) Handles process.Exited
    If filePaths.Count = 0 Then
        'No more files to execute.
        Application.Exit()
    Else
        'Execute the next file.
        Process = Process.Start(filePaths.Dequeue())
        Process.EnableRaisingEvents = True
    End If
End Sub

【问题讨论】:

这是因为您通过执行 .WaitForExit() 阻塞了 UI 线程。您需要响应Exited 事件才能知道何时移动到下一个文件。 我不完全理解 - 需要明确的是,我无法退出主应用程序,因为我正在使用 .WaitForExit()?正如所写,这对于不能一次播放所有音乐文件和打开太多文件是必要的。请进一步解释我如何“响应退出事件”。 jmcilhinney 的回答就是我的建议。 【参考方案1】:

不要使用循环并在其中调用WaitForExit。相反,将项目放在Queue 中,使下一个项目出列,调用Process.Start,然后处理ProcessExited 事件。在事件处理程序中,将下一个项目出列并再次执行相同操作。例如

Private WithEvents process As Process
Private filePaths As Queue(Of String)

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    filePaths = New Queue(Of String)(File.ReadAllLines("source file path here"))

    'Execute the first file.
    process = Process.Start(filePaths.Dequeue())
    process.EnableRaisingEvents = True
End Sub

Private Sub process_Exited(sender As Object, e As EventArgs) Handles process.Exited
    If filePaths.Count = 0 Then
        'No more files to execute.
        Application.Exit()
    Else
        'Execute the next file.
        process = Process.Start(filePaths.Dequeue())
        process.EnableRaisingEvents = True
    End If
End Sub

【讨论】:

它只播放了第一个文件(带有关联的播放器“VLC.exe”)。我需要调用 process_Exited 来播放更多音乐吗? 它只播放了第一个文件(带有关联的播放器“VLC.exe”)。我需要调用 process_Exited 来播放更多音乐吗?它还给出了一个错误,说 VLC 要求在 1 标题后以不寻常的方式终止。它从未加载过第二个。我使用的是 MPC-HC,因为它允许我通过命令行参数启动/停止每个标题。我如何强制使用该播放器与默认播放器? 事实上,Process 对象实际上并没有引发Exited 事件。我已经调整了我的代码示例来解决这个问题。对于每个新的 ProcessEnableRaisingEvents 属性现在设置为 True。您的其他问题超出了范围。 好的,它仍然只播放一首歌曲并停止。回到我原来的问题,我试图退出主程序,而 VLC 播放器正在运行第一个文件。我无法使用常规方式关闭它。 我怀疑你做错了什么,但没有看到你的代码就不可能说出来。您应该使用新代码和任何其他相关的新信息更新您的问题。

以上是关于如何在Mac上使用的Process.Start或同等使用Mono和传递参数的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 Process.Start 打开进程的输出结果?

Process.Start() 在 Windows 7 上立即退出

如何从 .NET 程序打开 Web 浏览器? Process.Start() 不起作用?

.Net Core 命令行应用程序 | Process.Start() 在某些机器上运行,但在其他机器上不运行

Tesseract,openCV,python:如何获取句子或同一行文本的边界框?

C# Process.Start with credentials 失败,拒绝访问