Tentando obter um segundo parâmetro na minha função do PowerShell para funcionar

2

Eu tenho uma função na qual estou trabalhando para extrair DisplayName e UninstallStrings do registro de um computador remoto. Se eu usar apenas o parâmetro "$ software", ele funciona bem para o meu PC local. Mas, se eu adicionar a variável "$ compname" e tentar um comando invoke para chegar a um PC remoto para fazer a mesma coisa, ele quebra. Aqui está o que eu tenho até agora:

Function Get-Uninstallers {

param(
    [parameter(mandatory=$true)][string]$compName,
    [parameter(mandatory=$true)][string]$software,
    $soft = ('"' + ("*" + $software + "*") + '"')
    )

Invoke-Command -ComputerName $compname {
Get-ChildItem -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall, HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall | '
Get-ItemProperty | Where-Object {$_.DisplayName -like $soft} | Select-Object DisplayName,UninstallString
}}

Eu tentei todos os tipos de combinações diferentes para a variável $ soft, com / sem aspas, aspas simples, sem um dos * s e sem ambos. Eu sei que estou fazendo algo errado, mas não consigo entender a vida de mim. Eu tentei adicionar citações ao parâmetro na linha de comando e deixá-las de fora.

Aqui está uma amostra da saída que estou recebendo quando eu preencho as variáveis:

PS C:\> Invoke-Command -ComputerName 61966 {
Get-ChildItem -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall, HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall | '
Get-ItemProperty | Where-Object {$_.DisplayName -like "*calabrio*"} | Select-Object DisplayName,UninstallString
}


DisplayName     : Calabrio Screen Player Plug-in version 8.0.2.2004
UninstallString : "C:\WINDOWS\unins000.exe"
PSComputerName  : 61966
RunspaceId      : cfdbbc09-42e6-4c1f-a2ba-0bedc623d73b

DisplayName     : Calabrio Analytic Services Client
UninstallString : MsiExec.exe /I{4762419C-C004-46F8-AB0D-DACA7C05258F}
PSComputerName  : 61966
RunspaceId      : cfdbbc09-42e6-4c1f-a2ba-0bedc623d73b

DisplayName     : Calabrio Monitoring and Recording Recording
UninstallString : MsiExec.exe /X{5144778B-D71E-4FE5-8AEB-D5A2DAE6DABA}
PSComputerName  : 61966
RunspaceId      : cfdbbc09-42e6-4c1f-a2ba-0bedc623d73b

DisplayName     : Calabrio Monitoring and Recording Services Service Release 0 Engineering Special 2
UninstallString : MsiExec.exe /X{FAEDCE7E-1A2B-4CCC-89D8-8DD28F51B05E}
PSComputerName  : 61966
RunspaceId      : cfdbbc09-42e6-4c1f-a2ba-0bedc623d73b

Aqui está um exemplo de quando eu executo a função especificando os parâmetros:

PS C:\> Get-Uninstallers -compName 61966 -software calabrio


DisplayName     : 
UninstallString : 
PSComputerName  : 61966
RunspaceId      : 2df812e2-8693-483f-918c-ece84892c5c5

DisplayName     : 
UninstallString : 
PSComputerName  : 61966
RunspaceId      : 2df812e2-8693-483f-918c-ece84892c5c5

DisplayName     : 
UninstallString : 
PSComputerName  : gmcr61966
RunspaceId      : 2df812e2-8693-483f-918c-ece84892c5c5

DisplayName     : 
UninstallString : 
PSComputerName  : 61966
RunspaceId      : 2df812e2-8693-483f-918c-ece84892c5c5

DisplayName     : 
UninstallString : 
PSComputerName  : 61966
RunspaceId      : 2df812e2-8693-483f-918c-ece84892c5c5

DisplayName     : 
UninstallString : 
PSComputerName  : 61966
RunspaceId      : 2df812e2-8693-483f-918c-ece84892c5c5

DisplayName     : 
UninstallString : 
PSComputerName  : 61966
RunspaceId      : 2df812e2-8693-483f-918c-ece84892c5c5

DisplayName     : 
UninstallString : "C:\Program Files (x86)\Common Files\Microsoft Shared\OFFICE14\Oarpmany.exe" /removereleaseinpatch "{90140000-0011-0000-0000-0000000FF1CE}" 
              "{71949C83-C5B4-43D2-9372-E3838A5E82E6}" "1033" "0"
PSComputerName  : 61966
RunspaceId      : 2df812e2-8693-483f-918c-ece84892c5c5

DisplayName     : 
UninstallString : 
PSComputerName  : 61966
RunspaceId      : 2df812e2-8693-483f-918c-ece84892c5c5

DisplayName     : 
UninstallString : 
PSComputerName  : 61966
RunspaceId      : 2df812e2-8693-483f-918c-ece84892c5c5

DisplayName     : 
UninstallString : 
PSComputerName  : 61966
RunspaceId      : 2df812e2-8693-483f-918c-ece84892c5c5

Aqui está a saída desejada:

PS C:\> Invoke-Command -ComputerName 61966 {
$software = "*calabrio*"
Get-ChildItem -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall, HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall | '
Get-ItemProperty | Where-Object {$_.DisplayName -like $software} | Select-Object DisplayName,UninstallString | FT
}
DisplayName                                                                           UninstallString                                                                     
-----------                                                                           ---------------                                                                     
Calabrio Screen Player Plug-in version 8.0.2.2004                                     "C:\WINDOWS\unins000.exe"                                                           
Calabrio Analytic Services Client                                                     MsiExec.exe /I{4762419C-C004-46F8-AB0D-DACA7C05258F}                                
Calabrio Monitoring and Recording Recording                                           MsiExec.exe /X{5144778B-D71E-4FE5-8AEB-D5A2DAE6DABA}                                
Calabrio Monitoring and Recording Services Service Release 0 Engineering Special 2    MsiExec.exe /X{FAEDCE7E-1A2B-4CCC-89D8-8DD28F51B05E}

Qualquer ajuda seria apreciada. Obrigado.

    
por Drew 04.08.2015 / 03:50

1 resposta

1

Eu tentei a sua função e também obtive um resultado vazio. O problema é o que você faz com seu parâmetro de software: você não precisa convertê-lo para a variável $soft , você pode usar diretamente o $software -Variable com o asterisco na cláusula Where-Object. Apenas use:

Get-ItemProperty | Where-Object {$_.DisplayName -like "*$software*"} | Select-Object DisplayName,UninstallString

Isso funciona no meu sistema, o curinga está funcionando bem também.

EDITAR: Aqui está a função completa que funciona na minha máquina - a linha onde você converteu a variável $software em $soft está desativada porque você não precisa dela:

Function Get-Uninstallers {

param(
    [parameter(mandatory=$true)][string]$compName,
    [parameter(mandatory=$true)][string]$software
    #$soft = ('"' + ("*" + $software + "*") + '"')
    )

Invoke-Command -ComputerName $compname {
Get-ChildItem -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall, HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall | '
Get-ItemProperty | Where-Object {$_.DisplayName -like "*$using:software*"} | Select-Object DisplayName,UninstallString
}
}

Quando eu uso a função, por exemplo,

Get-Uninstallers -compname my-pc -software VMWare

Eu recebo uma lista com todos os softwares onde o DisplayName contém " VMware ", e nada mais.

    
por 04.08.2015 / 08:00

Tags