Je peux exprimer mon besoin avec le scénario suivant: Écrire une fonction qui accepte une chaîne à exécuter en tant que commande native.
Ce n'est pas trop tiré par les cheveux d'une idée: si vous vous connectez à d'autres utilitaires de ligne de commande ailleurs dans l'entreprise qui vous fournissent une commande pour exécuter mot pour mot. Comme vous ne contrôlez pas la commande, vous devez accepter toute commande valide en entrée . Ce sont les principaux hoquets que j'ai été incapable de surmonter facilement:
La commande peut exécuter un programme vivant dans un chemin contenant un espace:
$command = '"C:\Program Files\TheProg\Runit.exe" Hello';
La commande peut avoir des paramètres avec des espaces:
$command = 'echo "hello world!"';
La commande peut avoir des ticks simples et doubles:
$command = "echo `"it`'s`"";
Y a-t-il un moyen propre d'accomplir cela? Je n'ai pu concevoir que des solutions de contournement somptueuses et laides, mais pour un langage de script, je pense que cela devrait être simple.
la source
eval
choses plaisantent à moitié parce que c'est ce qu'on appelle dans de nombreux autres langages de script, et ce n'est pas la première question que j'ai vue sur laquelle quelqu'un n'avait aucune idéeinvoke-expression
. Et le boîtier de l'OP ne ressemble qu'à un script interne.Invoke-Expression "& $command"
Veuillez également consulter ce rapport de Microsoft Connect sur essentiellement la difficulté de l'utilisation de PowerShell pour exécuter des commandes shell (oh, l'ironie).
http://connect.microsoft.com/PowerShell/feedback/details/376207/
Ils suggèrent d'utiliser
--%
comme moyen de forcer PowerShell à arrêter d'essayer d'interpréter le texte à droite.Par exemple:
la source
La réponse acceptée ne fonctionnait pas pour moi lorsque j'essayais d'analyser le registre pour désinstaller des chaînes et de les exécuter. Il s'avère que je n'avais pas besoin de l'appel
Invoke-Expression
après tout.Je suis finalement tombé sur ce joli modèle pour voir comment exécuter les chaînes de désinstallation:
Cela fonctionne pour moi, notamment parce qu'il
$app
s'agit d'une application interne qui, je le sais, n'aura que deux arguments. Pour des chaînes de désinstallation plus complexes, vous pouvez utiliser l' opérateur de jointure . De plus, je viens d'utiliser une table de hachage, mais vraiment, vous voudrez probablement utiliser un tableau.De plus, si vous avez plusieurs versions de la même application installées, ce programme de désinstallation les parcourra toutes à la fois, ce qui est déroutant
MsiExec.exe
, il y a donc cela aussi.la source
Si vous souhaitez utiliser l'opérateur d'appel, les arguments peuvent être un tableau stocké dans une variable:
L'opérateur d'appel fonctionne également avec les objets ApplicationInfo.
la source