我有一个PowerShell 1.0脚本来打开一堆应用程序.第一个是虚拟机,其他是开发应用程序.我希望虚拟机在其他应用程序打开之前完成启动.
在bash我可以说 "cmd1 && cmd2"
这就是我所拥有的......
C:\Applications\VirtualBox\vboxmanage startvm superdooper
&"C:\Applications\NetBeans 6.5\bin\netbeans.exe"
Run Code Online (Sandbox Code Playgroud) 如何使PowerShell等到Invoke-Item调用完成?我正在调用一个不可执行的项,所以我需要使用Invoke-Item来打开它.
我正在尝试使用Windows PowerShell 2.0来查找已安装的应用程序.我尝试了两种方法,一种使用WMI,另一种使用Registry.这两种方法都能够显示已安装的应用程序和组件的大量列表,但是似乎没有人提出我感兴趣的应用程序.
我特意寻找CruiseControl.NET.它出现在"程序和功能"控制面板小程序的应用程序列表中.我知道它目前已安装,因为我刚刚卸载并重新安装它以重新开始.但是,以下两种方法似乎都不起作用(它们成功,但没有返回结果):
注册表搜索方法
在注册表中HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall查找应用程序密钥.如果我删除where,则返回很多,但它缺少很多应用程序,它们出现在windows程序和功能控制面板中.
gci "hklm:\software\microsoft\windows\currentversion\uninstall"
| foreach { gp $_.PSPath }
| select DisplayVersion,InstallDate,ModifyPath,Publisher,UninstallString,Language,DisplayName
| where { $_.DisplayName -match "^Cruise*" }
Run Code Online (Sandbox Code Playgroud)
WMI方法
也返回了很多,但是,根据Win32_Product对象的文档,它们只是MSI安装的应用程序.许多应用程序都丢失了,我猜是因为它们不是MSI.CruiseControl.NET安装程序是NSIS(NullSoft安装系统)...因为它没有出现在这里,我猜它根本不使用MSI,但我很好奇是否有另一种使用WMI的方法找到任何/所有已安装的应用程序,无论它们是否使用过MSI.
gwmi -namespace "root\cimv2" -class "Win32_Product"
| select Name,Vendor,Version,IdentifyingNumber
| where { $_.Name -match "^Cruise*" }
Run Code Online (Sandbox Code Playgroud)
通过注册表查找应用程序并没有给我带来很多好处,真的.除非它还提供了一些方法来查找应用程序卸载程序和调用它的正确参数,但似乎并非总是如此.我更愿意使用WMI来查找和卸载我需要卸载的应用程序,因为这不仅允许我为我的所有脚本(WMI)使用单一管理界面,而且其他人应该很容易弄清楚如何因为WMI通常有很好的文档记录,所以在将来维护脚本.