2016-09-08 2 views
0

Nous avons ici besoin d'un script rapide pour transmettre un nom de variable à une ligne de commande. Facile mais je suis perplexe quand même. J'ai besoin d'utiliser msiexec/f pour réparer un msi dans le répertoire C: \ windows \ installer. Le MSI, cependant, a un nom de variable. J'ai besoin d'obtenir le nom local et ensuite mettre ce nom et le chemin dans le script. Il devrait alors exécuter msiexec/f avec le chemin et le nom corrects au MSI local. Cela pourrait être une chose simple de citation/format ou peut-être que j'aboie à la mauvaise porte entièrement. Je suis relativement nouveau à ce sujet. Des idées?insertion d'une variable powershell dans la commande msiexec

$localpackageName = 'localPackageName' 

get-wmiobject -class win32_product -filter "name = 'smart ink'" | select-object localpackage -outvariable localPackageName 

Invoke-Expression -command C:\windows\system32\MSIExec.exe /f $localPackageName 
+0

Vous devriez éviter win32_product, voir mon commentaire ci-dessous pour la raison. – bluuf

Répondre

1

Si vous essayez juste de déclencher une réparation Smart encre il y a des approches plus faciles. Msiexec vous permet de pass it the guid for the ProductId au lieu d'un chemin d'accès à un msi. Tout ce que vous avez à faire est d'obtenir le guid qui devrait rester le même pour toutes les installations de la même version du logiciel. Un moyen facile d'obtenir le GUID du registre au lieu d'invoquer Win32_Product est:

##Read in installed packages, check for a displayname, split the key to get the GUID 
$prodId = Get-ChildItem HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall | 
Where-Object {$_.GetValue('DisplayName') -match 'smart ink'} | 
Foreach-Object { $_.Name -split '\\'} | Select-Object -last 1 

Dans mon cas, ce rendement {5ABC49B5-D0DC-428D-A082-4AEFF6490F04} comme Smart Ink ID de produit. Vous pouvez ensuite passer cela à msiexec.

msiexec /fa $prodId 
-1

Try this ...

$localPackageName = 'localPackageName' 
$command = 'C:\windows\system32\MSIExec.exe /f' 

get-wmiobject -class win32_product -filter "name = 'smart ink'" | select-object localpackage -outvariable localPackageName 

$packageName = $localPackageName.localpackage 

$string = '{0} {1}' -f $command, $packageName 
Invoke-Expression $string 
+0

Downvoted car win32_product doit être évité à tout prix. Il force une vérification de cohérence sur TOUS les paquets MSI enregistrés et fait automatiquement une réparation qui peut réinitialiser les paramètres personnalisés (été là moi-même). A cause du re registre des paquets c'est aussi très lent. Vous pouvez vérifier cela en vérifiant le journal des événements de l'application après avoir interrogé cette classe. – bluuf