我从这里获得了这个脚本,它可以用于卸载应用程序,但只有在前两行使用-match
而不是-like
时,即使我使用整个应用程序名称。
应用程序的名称包含版本,因此我想在脚本中使用通配符来支持“MyApp 2.4.1”等等。谢谢!
$uninstall32 = gci "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" |
foreach { gp $_.PSPath } | ? { $_ -like "MyApp*" } | select UninstallString
$uninstall64 = gci "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" |
foreach { gp $_.PSPath } | ? { $_ -like "MyApp*" } | select UninstallString
if ($uninstall64) {
$uninstall64 = $uninstall64.UninstallString -Replace "msiexec.exe","" -Replace "/I","" -Replace "/X",""
$uninstall64 = $uninstall64.Trim()
Write "Uninstalling..."
start-process "msiexec.exe" -arg "/X $uninstall64 /qb" -Wait
}
if ($uninstall32) {
$uninstall32 = $uninstall32.UninstallString -Replace "msiexec.exe","" -Replace "/I","" -Replace "/X",""
$uninstall32 = $uninstall32.Trim()
Write "Uninstalling..."
start-process "msiexec.exe" -arg "/X $uninstall32 /qb" -Wait
}
答案 0 :(得分:3)
Get-ItemProperty
生成一个对象,而不是一个字符串。检查DisplayName
属性而不是对象本身。您还应该展开卸载字符串,以便以后不需要使用$uninstall64.UninstallString
。
$uninstall64 = gci "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" |
foreach { gp $_.PSPath } |
? { $_.DisplayName -like "MyApp*" } |
select -Expand UninstallString
答案 1 :(得分:2)
考虑以下字符串" MyApp 2.3.4"同时将介绍您所引用的两个示例之间的重要区别:
? { $_ -like "MyApp*" }
? { $_ -match "MyApp*" }
-Like
正在寻找一个字符串以" MyApp"开始其次是什么。 -Match
正在寻找文字" MyApp"其次是任何角色。由于前面有空格,-Like
会失败。 -Match
对待" MyApp *"作为一个正则表达式字符串,寻找" MyApp"其次是任何角色。在这种情况下,它不关心它匹配的空间。我怀疑-match
如果你更改它? { $_ -match "^MyApp*" }
也会失败,因为插入符号表示字符串的开头。
如果您希望-like
在这种情况下工作,则应将其更改为? { $_ -like "*MyApp*" }
重要强>
虽然我对你的比较无效的原因是正确的Ansgar answer解决了这个问题首先发生在你身上的原因。