如何使用管道将一个命令的输出重定向到另一个命令的输入?

问题描述 投票:30回答:3

我有一个程序将文本发送到LED标志。

prismcom.exe

要使用该程序发送“Hello”:

prismcom.exe usb Hello

现在,我希望使用一个名为Temperature的命令程序。

temperature

假设程序给出了计算机的温度。

Your computer is 100 degrees Fahrenheit.

现在,我希望将温度输出写入prismcom.exe:

temperature | prismcom.exe usb

这似乎不起作用。

是的,我已经找了20多分钟的解决方案了。在所有情况下,它们都是kludges / hacks或Windows命令行之外的解决方案。

我很欣赏如何将输出从温度传输到prismcom的方向。

谢谢!

编辑:Prismcom有两个论点。第一个将永远是'usb'。之后发生的任何事情都会显示在标志上。

windows pipe command-prompt
3个回答
22
投票

试试这个。将其复制到批处理文件中 - 例如send.bat - 然后只需运行send.bat即可将消息从温度程序发送到prismcom程序。

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

12
投票

这应该工作:

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

如果在批处理文件中运行,则需要使用%%i而不仅仅是%i(在这两个地方)。


9
投票

您还可以使用PowerShell在Cmd.exe命令行上运行完全相同的命令。为简单起见,我会采用这种方法......

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

请阅读Understanding the Windows PowerShell Pipeline

您还可以在命令行输入C:\>PowerShell,它会立即将您置于PS C:\>模式,您可以直接开始编写PS。


0
投票

不确定您是否正在编写这些程序,但这是一个如何执行此操作的简单示例。

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;
}

编译两个然后运行program1.exe "this subject has a submarine as a subsequence" | rgx.exe "\b(sub)([^ ]*)"

|操作符只是将program1的printf操作的输出从stdout流重定向到stdin流,从而它坐在那里等待rgx.exe接收。

© www.soinside.com 2019 - 2024. All rights reserved.