web-dev-qa-db-fra.com

Comment utiliser un canal pour rediriger la sortie d'une commande vers l'entrée d'une autre?

J'ai un programme qui envoie du texte à un panneau LED.

prismcom.exe

Pour utiliser le programme pour envoyer "Bonjour":

prismcom.exe usb Hello

Maintenant, je souhaite, par exemple, utiliser un programme de commande appelé Température.

temperature

Disons que le programme donne la température de votre ordinateur.

Your computer is 100 degrees Fahrenheit.

Maintenant, je souhaite écrire la sortie de température dans prismcom.exe:

temperature | prismcom.exe usb

Ça n'a pas l'air de fonctionner.

Oui, j'ai cherché une solution à cela depuis plus de vingt minutes. Dans tous les cas, ce sont des kludges/hacks ou une solution pour autre chose que la ligne de commande Windows.

J'apprécierais la direction sur la façon dont je dirigerais la sortie de la température au prismcom.

Merci!

Edit: Prismcom a deux arguments. Le premier sera toujours "usb". Tout ce qui vient après sera affiché sur le panneau.

31
Austin Burk

Essaye ça. Copiez ceci dans un fichier batch - tel que send.bat - puis exécutez simplement send.bat pour envoyer le message du programme de température au programme prismcom.

temperature.exe > msg.txt
set /p msg= < msg.txt
prismcom.exe usb "%msg%"
23
Kenny Kerr

Cela devrait fonctionner:

for /F "tokens=*" %i in ('temperature') do prismcom.exe usb %i

Si vous exécutez dans un fichier batch, vous devez utiliser %%i au lieu de simplement %i (aux deux endroits).

12
Harry Johnston

Vous pouvez également exécuter exactement la même commande sur la ligne de commande Cmd.exe à l'aide de PowerShell. J'irais avec cette approche pour plus de simplicité ...

C:\>PowerShell -Command "temperature | prismcom.exe usb"

Veuillez lire Comprendre le pipeline Windows PowerShell

Vous pouvez également taper C:\>PowerShell sur la ligne de commande et cela vous mettra dans PS C:\> en mode instantané, où vous pouvez directement commencer à écrire PS.

10
Ostati

Je ne sais pas si vous codez ces programmes, mais ceci est un exemple simple de la façon dont vous le feriez.

program1.c

#include <stdio.h>
int main (int argc, char * argv[] ) {
    printf("%s", argv[1]); 
    return 0;
}

rgx.cpp

#include <cstdio>
#include <regex>
#include <iostream>
using namespace std;
int main (int argc, char * argv[] ) {
    char input[200];
    fgets(input,200,stdin);
    string s(input)
    smatch m;
    string reg_exp(argv[1]);
    regex e(reg_exp);
    while (regex_search (s,m,e)) {
      for (auto x:m) cout << x << " ";
      cout << endl;
      s = m.suffix().str();
    }
    return 0;
}

Compilez les deux puis exécutez program1.exe "this subject has a submarine as a subsequence" | rgx.exe "\b(sub)([^ ]*)"

L'opérateur | Redirige simplement la sortie de l'opération printf de program1 du flux stdout vers le flux stdin où il est assis en attendant que rgx.exe choisisse vers le haut.

0
annoying_squid