2015-01-15 3 views
0

Я получил этот скрипт отсюда, и он работает для удаления приложения, но только когда -match используется вместо -like в первых двух строках, даже если я использую все имя приложения.Почему-как не работает, но -match делает?

Имя приложения включает в себя версию, поэтому я хотел бы подстановить имя в скрипте для поддержки «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

Если '-match' работал, но' -like' не только разница в том, что если фактическая строка была «1MyAPP 2.3.4» или «MYAPP 2.3.4» '-match' бы найти его, так как матч только заботится, если строка присутствует где угодно, но как не будет, так как она ожидает, что первый символ будет М и так далее. Интересно, есть ли какие-либо символы до M. Если вы изменили предложение на '? {$ _ -match"^MyApp "}', он все еще работает? – Matt

+0

Я думаю, что ты прав. Я не вижу никаких ведущих символов в свойстве name, но я добавил «*» и в начало, и это сработало. Не стесняйтесь представить в качестве ответа. Благодаря! – NSouth

ответ

2

Рассмотрим следующую строку "MyApp 2.3.4", а будет смотреть на важное различие между этими двумя примерами, которые относятся к:

  • Как ? { $_ -like "MyApp*" }
  • Match ? { $_ -match "MyApp*" }

-Like ищет строку , начинающуюся с с помощью "MyApp", за которой следует nything. -Match ищет текст «MyApp», за которым следует любой символ. Ошибка -Like, так как есть предыдущее пространство. -Match рассматривает «MyApp *» как строку регулярного выражения, которая ищет «MyApp», за которой следует любой символ. В этом случае он не заботится о том, чтобы пространство соответствовало ему. Я подозреваю, что -match потерпит неудачу, если вы изменили его слишком ? { $_ -match "^MyApp*" }, поскольку карет говорит начало строки.

Если вы хотите -like работать в этом случае вы должны изменить его на ? { $_ -like "*MyApp*" }

Важно

В то время как я правильно о том, почему ваше сравнение не работает Ansgar answer Адреса причину этого вопроса происходило в вы в первую очередь.

+0

Готово. И хорошее объяснение. Благодаря! – NSouth

3

Get-ItemProperty создает объект, а не строку. Проверьте свойство DisplayName вместо самого объекта. Вы также должны расширить строку удаления, так что вам не нужно будет использовать $uninstall64.UninstallString позже.

$uninstall64 = gci "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | 
       foreach { gp $_.PSPath } | 
       ? { $_.DisplayName -like "MyApp*" } | 
       select -Expand UninstallString
+1

дерьмо ... вот почему у него возникают проблемы с '-like' и' -match'. Вся строка, представляющая элемент реестра, сравнивается. «MyApp» появляется где-то посередине. Я прав о том, почему он не работает, однако это касается основной проблемы. Я так люблю – Matt

Смежные вопросы