J'ai besoin d'appeler DISM.exe via son chemin absolu qui change en fonction de l'architecture du système. Par conséquent, je stocke le chemin de fichier de dism.exe dans une variable et je procède ensuite à l'exécution de la commande wntire par l'intermédiaire de invoke-expression
comme ça :
$dism = "C:\Windows\sysnative\dism.exe"
invoke-expression "$dism /online /enable-feature /featurename:$index"
Cela fonctionne bien. Cependant, je dois également canaliser la sortie de DISM dans une commande find, et j'essaie donc ceci :
invoke-expression "$dism /online /get-featureinfo /featurename:$index | find `"State :`""
Cela me donne l'erreur "FIND : Parameter format not correct". J'ai essayé de mettre la chaîne de paramètres de find dans sa propre variable -> rien.
Comment puis-je passer des chaînes entre guillemets dans un appel à invoke-expression ?
EDIT : Habituellement, j'utiliserais la version cmdlet de toute commande DISM (dans ce cas, je pourrais utiliser get-WindowsOptionalFeature
). Cependant, ce script fait partie d'une application qui est déployée via SCCM Software Center. La raison pour laquelle je ne peux pas utiliser la version cmdlet ici est la suivante : SoftwareCenter est une application 32 bits et donc le powershell-script est également exécuté en mode 32 bits. Je dois modifier à la fois les images 32 et 64 bits. Je contourne ce problème en lançant Powershell à partir du dossier sysnative caché (explication cf. aquí ).
Cependant, comme je ne peux pas savoir à l'avance si l'image que je modifie est 32 bits ou 64 bits, je dois le vérifier au début de mon script et ensuite je stocke le chemin du programme correspondant pour Powershell dans une variable.
Maintenant, je sais que je peux utiliser invoke-expression
(voir le code ci-dessus) pour appeler une commande stockée dans une variable avec des paramètres. Je ne sais pas comment faire cela avec les cmdlets, car cela ne me donne pas la possibilité d'utiliser un chemin de programme personnalisé. C'est pourquoi j'ai dû utiliser l'ancienne commande dism.exe. J'ai maintenant une solution de contournement pour toute la situation qui consiste à avoir un "launcher" script qui détecte le bitness à l'avance et lance ensuite mon script réel avec la version correspondante de Powershell.
La question initiale, qui est "comment puis-je passer des paramètres contenant des arguments cités à la fonction invoke-expresion
-... et la commande de l'utilisateur est toujours valable... Merci d'avance !