捕获通过管道传输到批处理文件的真实STDIN

时间:2019-04-15 15:27:06

标签: batch-file cmd stdin

我想在其他一些命令后 后从批处理文件中访问STDIN。我知道.BAT文件中的第一个命令接收到STDIN,但是我想先运行其他命令然后捕获。我还希望它能与流式STDIN一起使用,即,从一开始就将STDIN捕获到文件中是不可接受的(请参见下面的解决方法)。

现在,我知道CON是代表STDIN的“文件”,并且TYPE CON将输出(回显)STDIN。在批处理文件中,这似乎根本不起作用。实际上,它似乎不代表STDIN,而是代表用户/主机通过键盘输入。

test.bat

TYPE CON > output.txt

试运行:

C:>TYPE myfile.txt | test.bat

预期结果:myfile.txt被复制到output.txt

实际结果:该批处理等待用户输入(忽略传递给它的内容),并将在键盘上键入的用户输入写入output.txt

解决方法

一种解决方法:以下test.bat可行,但不支持流输入(例如,来自tail命令的输入):

findstr "^" STDIN.txt
:: I can now run some other commands
:: And finally access my STDIN via STDIN.txt
TYPE STDIN.txt | AWK /e/ > output.txt

更新:背景故事: 我有一个整洁的CMD,它使用Powershell下载(通过HTTP)任意的.ps1脚本(如程序包管理器一样)并即时执行它。如果我调用REMEXEC.bat mymodule foo bar,它将加载并执行带有参数mymodule.ps1foo的{​​{1}}。

这对于管道传输流输入之外的所有场景都非常有效。使用bar适用于管道输入,但不适用于开放流。使用说findstr "^"作为我的BAT的第一行,可以使我流化输入,但只会将问题推向前进。

最终我想要一个AWK /.*/,它看起来像这样(伪代码):

something.bat

陷阱22是downloadPSModule( "http://myrepo.com/modules/%1.ps1" ) STDIN | executePSModule %2 %3 %4 发生在downloadPSModule之前,因此无法访问STDIN(为BAT的第一行保留的特权)。

1 个答案:

答案 0 :(得分:0)

如果您需要从控制台检索输入或隔离从stdin流中读取的内容以不占用管道数据,我会尝试使用类似

的方法从控制台直接读取
@echo off
    setlocal enableextensions disabledelayedexpansion

    rem Part that reads from console, not piped input
    < con (
        set "data="
        set /p "data=Type something: "
    )

    echo(
    echo You have typed: [%data%]
    echo(

    rem Part that reads piped input
    find /v "" 

执行时

W:\>type test.cmd | test.cmd
Type something: this is a test

You have typed: [this is a test]

@echo off
    setlocal enableextensions disabledelayedexpansion

    rem Part that reads from console, not piped input
    < con (
        set "data="
        set /p "data=Type something: "
    )

    echo(
    echo You have typed: [%data%]
    echo(

    rem Part that reads piped input
    find /v ""