我正在尝试编写一个表单,我可以选择使用不同的会话打开一个exe,每个会话都有2个核心。我需要这个程序的程序叫做Revit 2015.我已经找到了一种方法将它包含在我的应用程序中,Revit 2015与之完美配合:
cmd.exe / c start“Revit”/ affinity XX“C:\ Program Files \ Autodesk \ Revit 2015 \ Revit.exe
在我的视觉项目中它会像这样:
Private Sub GPG4B1_Click(sender As Object, e As EventArgs) Handles GPG4B1.Click
If Not Me.RadioButton1.Checked And Not Me.RadioButton2.Checked Then
MessageBox.Show("Please select a Revit version")
Else
If IsNothing(Me.ComboBoxGP.SelectedItem) Then
MessageBox.Show("Please select the Cores")
Else
If Me.RadioButton1.Checked And Me.ComboBoxGP.Text = "1 Core" Then
Shell("cmd.exe /c start ""Revit"" /affinity 00000001 ""C:\Program Files\Autodesk\Revit 2015\Revit.exe""")
End If
If Me.RadioButton1.Checked And Me.ComboBoxGP.Text = "2 Cores" Then
Shell("cmd.exe /c start ""Revit"" /affinity 9 ""C:\Program Files\Autodesk\Revit 2015\Revit.exe""")
End If
If Me.RadioButton1.Checked And Me.ComboBoxGP.Text = "3 Cores" Then
Shell("cmd.exe /c start ""Revit"" /affinity 15 ""C:\Program Files\Autodesk\Revit 2015\Revit.exe""")
End If
因此用户可以从我的表单中选择带有单选按钮工具的Revit版本,并且从组合框中,他会选择他想要使用的核心集。 出于某种原因,这并不能用Revit 2016来削减它!使用相同的命令行最终会对Revit会话的亲和力无效我试图通过该命令行
但互联网是慷慨的,所以我找到了Revit 2016的解决方案,那就是在Revit启动后通过PowerShell命令行,所以我现在想弄清楚如何传递这个PowerShell命令将2016 Revit升级到特定会话,而不影响其他会话 这是PowerShell系列:
$ Process = Get-Process Revit; $ Process.ProcessorAffinity = 255
因此,使用此PowerShell命令行,我能够选择可以与Revit 2016一起使用的核心点。下一步是将其合并到我的表单中,但正如您已经知道的那样,如果我在任何时候通过它,这将影响其他“Revit.exe”会话,并将它们带到我在命令行中指定的相同核心。所以我不得不想办法通过PID来区分Revit的过程,并且vb.net通过使用它很简单:
myProcess.Id
并使用此代码:
myProcess.StartInfo.FileName = "C:\Program Files\Autodesk\Revit 2016\Revit.exe"
myProcess.Start()
TextBox1.Text = myProcess.Id
我能够完成,打开Revit并捕获其PID。 我的问题是,如何使用特定会话的进程ID并将该PowerShell命令传递给我刚开始使用该特定ID的进程?
谢谢。
答案 0 :(得分:1)
启动进程所需的一切都包含System.Diagnostics
命名空间。您可以做的一件事是提供此命令行以将应用程序启动到Process.Start(String,String) method,后者将返回一个流程对象。其中,如果用户具有权限,您还可以设置关联(请参阅Process类 - 这是您的PowerShell代码正在执行的操作)。
MSDN代码示例应该足够了,但如果没有,请随时与我们联系!