【问题标题】:How to start a new Powershell window with arguments from a script?如何使用脚本中的参数启动新的 Powershell 窗口?
【发布时间】:2018-12-07 10:47:09
【问题描述】:

我正在使用 VirtualBox,我希望能够使用 powershell 脚本获取所有虚拟机的列表(在单击 gui 上的按钮之后)。

我知道你可以使用命令

"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" list vms

在 cmd/batch 中列出所有虚拟机,但我似乎无法弄清楚如何使用我的 powershell 脚本显示输出。这就是为什么我想创建一个新的 powershell 窗口来执行这个命令,这样我就有了一个虚拟机列表。

我试过这样做,但什么也没发生:

& 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe' list vms

提前致谢。

最好的问候, 约翰

【问题讨论】:

  • 您可能想看看this question about output capturing(与运行命令无关,但与您问题的第二部分有关)。
  • 也许可以尝试使用 ListView 让它看起来不那么“充满活力”。在其中添加了一个功能并为您提供了一个示例。 pastebin.com/9RaKU0bk

标签: powershell batch-file cmd virtual-machine virtualbox


【解决方案1】:

当从事件(例如单击)处理程序运行 PowerShell 脚本块时,脚本块的输出会被简单地丢弃。您需要做的是在全局变量中捕获输出,如下所示:

$Button4.Add_Click({$global:result =  & 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe' list vms})

这会将输出分配给全局变量 $global:result,然后您可以在其他任务中使用该变量。

是的,我正在尝试打开一个新的 powershell 窗口

您真的想打开一个窗口还是只想运行一个后台(异步)作业?如果您只想要一份后台工作,那么您应该查看Start-Job。使用Start-Process 的问题之一是您不会得到结果,但您可以使用 PowerShell 作业。如果您使用Start-Job,代码将如下所示:

$Button4.Add_Click({$global:lvmjob =  Start-Job { & 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe' list vms}})

然后在你的代码的其他地方,你可以通过做来接收作业结果

$data = receive-job -Job $global:lvmjob

【讨论】:

  • 感谢您的详细回答,但是否可以将输出放入组合框?
  • 当然 - 不是将其分配给一个值,而是在组合框上的 Items 属性上使用 AddRange() 方法,如下所示:$button.add_Click{$combobox.Items.AddRange((& 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe' list vms)) 其中$combobox 是指向您的组合框的变量控制。
【解决方案2】:

你试过了吗:

cmd /c 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe' list vms

您也应该能够做到这一点:

powershell.exe "& 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe' list vms"

编辑

如果你想要一个新窗口,使用这个:

Start-Process powerShell.exe "& 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe' list vms; pause"

pause 将在新窗口退出之前等待您按 Enter。

【讨论】:

  • 如果我只有命令,你的代码就可以工作。但是我的命令进入了一个按钮,没有任何反应。这是我的代码:$Button4.Add_Click({ cmd /c 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe' list vms})
  • 好的,是否缺少部分代码?您是否尝试打开一个新的 powershell 窗口并在其上显示结果?该命令正在执行,但您没有收到它。即使它打开一个新窗口,它也会在执行后立即退出。
  • 是的,我正在尝试打开一个新的 powershell 窗口,因为我只有 GUI,我需要一些东西来列出其中的虚拟机。这是完整的代码:pastebin.com/UE8Yw5cV
  • 试试这个:Start-Process powerShell.exe "& 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe' list vms; pause"
  • 我在你的代码上试过了。它对我有用。但是,它返回空白,因为我在虚拟框中没有任何 vm。希望对您有所不同。
猜你喜欢
  • 2017-12-26
  • 2012-11-04
  • 1970-01-01
  • 2012-02-06
  • 1970-01-01
  • 2011-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多