Comment exécuter une commande native arbitraire à partir d'une chaîne ?

Comment exécuter une commande native arbitraire à partir d’une chaîne ?

Invoke-Expression, aussi aliasé comme iex. Ce qui suit fonctionnera pour vos exemples #2 et #3 :

iex $command

Certaines chaînes ne s’exécuteront pas telles quelles, comme votre exemple #1, car l’exécutable est entre guillemets. Ceci fonctionnera tel quel, car le contenu de la chaîne correspond exactement à ce que vous taperiez directement depuis une invite de commande PowerShell :

$command = 'C:\somepath\someexe.exe somearg'
iex $command

Cependant, si l’exécutable est entre guillemets, vous avez besoin de l’aide de & pour le faire fonctionner, comme dans cet exemple, exécuté depuis la ligne de commande :

>> &"C:\Program Files\Some Product\SomeExe.exe" "C:\some other path\file.ext"

Et ensuite dans le script :

$command = '"C:\Program Files\Some Product\SomeExe.exe" "C:\some other path\file.ext"'
iex "& $command"

Il est probable que vous pourriez gérer presque tous les cas en détectant si le premier caractère de la chaîne de commande est ", comme dans cette implémentation naïve :

function myeval($command) {
    if ($command[0] -eq '"') { iex "& $command" }
    else { iex $command }
}

Mais vous pourriez trouver d’autres cas qui doivent être invoqués de manière différente. Dans ce cas, vous devrez soit utiliser try{}catch{}, éventuellement pour des types/messages d’exception spécifiques, soit examiner la chaîne de commande.

Si vous recevez toujours des chemins absolus plutôt que des chemins relatifs, vous ne devriez pas avoir beaucoup de cas particuliers, voire aucun, en dehors des 2 ci-dessus.