为什么 - 不工作但-match呢?

时间:2015-01-15 21:40:24

标签: powershell

我从这里获得了这个脚本,它可以用于卸载应用程序,但只有在前两行使用-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
}

2 个答案:

答案 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解决了这个问题首先发生在你身上的原因。