Powershell exécute remote exe avec les arguments de ligne de commande sur l'ordinateur distant

j'ai cherché partout et essayé différentes variations de commandes, mais je n'en suis pas encore là.

mon but est d'exécuter un exe qui réside déjà sur une machine distante et passer en arguments de ligne de commande. J'ai essayé la commande invoke-command, mais je n'arrive pas à obtenir ma syntaxe pour reconnaître les arguments.

Méthodes essayé:

  1. Win32_Process.Créer()
  2. Invoke-Command
  3. Démarrer-Processus
  4. [diagnostics.processus]::démarrer
  5. Invoke-WmiMethod

D'après mes tests, le plus proche que je puisse obtenir est avec la commande suivante:

$command = "program.exe -r param"
Invoke-Command -ComputerName $server -ScriptBlock {$command}

la commande s'exécute sans erreur ni retour de code, mais sur la machine distante, elle ne s'exécute pas avec des arguments. J'ai joué avec des guillemets simples / doubles pour voir si des changements, mais aucun.

17
demandé sur Tshepang 2012-03-02 19:07:48

5 réponses

avez-vous essayé d'utiliser le -ArgumentList paramètre:

invoke-command -ComputerName studio -ScriptBlock { param ( $myarg ) ping.exe $myarg } -ArgumentList localhost   

http://technet.microsoft.com/en-us/library/dd347578.aspx

un exemple d'invoquer un programme qui n'est pas dans le chemin et qui a un espace dans son chemin de chemise:

invoke-command -ComputerName Computer1 -ScriptBlock { param ($myarg) & 'C:\Program Files\program.exe' -something $myarg } -ArgumentList "myArgValue"

Si la valeur de l'argument est statique, vous pouvez simplement fournir dans le bloc de script comme ceci:

invoke-command -ComputerName Computer1 -ScriptBlock { & 'C:\Program Files\program.exe' -something "myArgValue" } 
21
répondu Andy Arismendi 2012-03-02 18:53:48

essayez-vous de passer les arguments en ligne de commande au programme lorsque vous le lancez? Je travaille sur quelque chose qui fait exactement ça, et c'était beaucoup plus simple que je le pensais. Si je vais dans la ligne de commande et tapez

C:\folder\app.exe/xC:\folder\file.txt

ensuite, mon application se lance, et crée un fichier dans le répertoire spécifié avec le nom spécifié.

je voulais le faire à travers un script Powershell sur une machine distante, et j'ai compris que tout ce que je devais faire était mettre

$s = New-PSSession -computername NAME -credential LOGIN
    Invoke-Command -session $s -scriptblock {C:\folder\app.exe /xC:\folder\file.txt}
Remove-PSSession $s

(j'ai un tas de commandes similaires à l'intérieur de la session, c'est juste le minimum qu'il faut pour exécuter) notez l'espace entre l'exécutable et les arguments de la ligne de commande. Il fonctionne pour moi, mais je ne sais pas exactement comment fonctionne votre application, ou si c'est même la façon dont vous passer des arguments.

* je peux aussi avoir mon application pousser le fichier de nouveau à mon propre ordinateur local en changeant le script-bloc en

C:\folder\app.exe /x"\LocalPC\DATA (C)\localfolder\localfile.txt"

vous avez besoin des guillemets si votre chemin de fichier comporte un espace.

EDIT: en fait, cela a soulevé quelques problèmes stupides avec Powershell lançant l'application comme un service ou quelque chose, donc j'ai fait quelques recherches, et j'ai compris que vous pouvez appeler CMD pour exécuter des commandes pour vous sur l'ordinateur distant. De cette façon, la commande est exécutée exactement comme si vous l'aviez tapée dans une fenêtre CMD sur la machine distante. Mettez la commande dans le scriptblock en double cite, puis mets un cmd.exe / C avant. comme ceci:

cmd.exe /C "C:\folder\app.exe/xC:\folder\file.txt"

cela a résolu tous les problèmes que j'ai eu récemment.

MODIFIER MODIFIER: Eu plus de problèmes, et a trouvé une bien meilleure façon de le faire.

start-process -filepath C:\folder\app.exe -argumentlist "/xC:\folder\file.txt"

et cela ne bloque pas la fenêtre de votre terminal en attendant la fin du processus à distance. Assurez-vous juste que vous avez un moyen d'arrêter le processus si elle ne le fait pas sur elle-même. (le mien ne le fait pas, nécessite le codage d'un autre l'argument)

4
répondu Kyle Gagnon 2014-08-01 20:25:26

j'ai essayé d'atteindre ceci en utilisant une entrée simple d'une ligne mais j'ai terminé que la commande Invoke n'a pas fonctionné avec succès parce qu'elle tue le processus immédiatement après le début malgré qu'elle puisse fonctionner si vous entrez dans la session et attendez assez avant de quitter.

la seule façon de travailler que j'ai pu trouver, par exemple, pour exécuter une commande avec des arguments et de l'espace sur la machine distante HFVMACHINE1 (exécutant Windows 7) est la suivante:

([WMICLASS]"\HFVMACHINE1\ROOT\CIMV2:win32_process").Create('c:\Program Files (x86)\Thinware\vBackup\vBackup.exe -v HFSVR12-WWW')
1
répondu P. Lion 2018-05-21 08:18:24
$sb = [scriptblock]::create($command)
-1
répondu Monika 2016-05-12 17:52:15
$sb = ScriptBlock::Create("$command")
Invoke-Command -ScriptBlock $sb

Cela devrait fonctionner et éviter d'induire en erreur les débutants.

-2
répondu Paul Yang 2014-02-25 09:30:42