2017-10-19 15 views
0

J'ai un script Powershell qui doit exécuter un exécutable en ligne de commande qui demande l'entrée d'utilisateur (pour lequel il n'y a pas de paramètre de ligne de commande). Quelque chose comme ceci:Comment faire un script Powershell répondre à une invite pour l'entrée de l'utilisateur?

# promptsForInput.ps1 
$someInput = Read-Host "Gimme some input" 
# do something with $someInput 

L'exécutable réel est un binaire compilé que je ne peux pas modifier, mais ce script exemple faire dans le cadre de cette question. Mon script Powershell appelle l'exécutable:

# myScript.ps1 
.\promptsForInput.ps1 

Lors de l'exécution, je reçois quelque chose invité à d'entrée:

> .\myScript.ps1 
Gimme some input: 

Je dois être en mesure de remplir cette demande d'entrée sans intervention de l'utilisateur. Lorsque promptsForInput.ps1 invites pour l'entrée d'utilisateur, j'ai besoin myScript.ps1 d'entrer la valeur requise et procéder à l'exécution du script.

Des questions similaires sur SO soit des réponses spécifiques à l'exe particulier, ou sont par ailleurs inutile:

Répondre

0
  1. Ne pas utiliser $input comme le nom d'une variable qui est une variable automatique PowerShell (voir help about_Automatic_Variables).

  2. déterminer si l'exécutable peut accepter des arguments de ligne de commande au lieu d'arrêter ou de demander d'entrée. Ceci est évidemment préféré s'il est disponible.

  3. Que vous pouvez dire PowerShell d'envoyer automatiquement l'entrée à un exécutable arbitraire dépend de la conception de cet exécutable. Si l'exécutable vous permet d'envoyer l'entrée standard, vous pouvez exécuter quelque chose comme

    "test" | myexecutable.exe 
    

    Dans cet exemple, PowerShell fournira la chaîne test et un retour en entrée standard pour l'exécutable. Si l'exécutable accepte l'entrée standard, alors cela fonctionnera.

    Si l'exécutable pas utilise l'entrée standard, alors vous devrez faire quelque chose de différent comme envoyer des frappes à la fenêtre. Je considère l'envoi de frappes en dernier recours et une solution fragile qui n'est pas conviviale pour l'automatisation.

+0

'$ input' était juste utilisé pour l'exemple (je vais le changer); Comme je l'ai dit, le programme en cours s'appelle un binaire. – asgallant

+0

Existe-t-il un moyen d'étendre la méthode pipe à plus d'entrées? En supposant que 'promptsForInput.ps1' demande plusieurs entrées,' "foo" | "barre" | . \ promptsForInput.ps1' (évidemment) ne fonctionnera pas, y a-t-il une syntaxe qui le fera? – asgallant

+0

Si vous avez plusieurs lignes d'entrée, vous pouvez séparer avec '\' r \ 'n'; par exemple. '' "Ligne 1'r'nLine2" ''. Mais encore une fois: Cela dépend entièrement si l'exécutable accepte l'entrée standard. Ce n'est pas sous le contrôle de PowerShell. –