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

Batch file 捕获通过管道传输到批处理文件的真实STDIN,batch-file,cmd,stdin,Batch File,Cmd,Stdin,我想在执行其他一些命令之后,从批处理文件中访问STDIN。我知道.BAT文件中的第一个命令接收STDIN,但我想先运行一些其他命令,然后捕获STDIN。我还希望它能够与流式STDIN一起使用,即在开始时不接受将STDIN捕获到文件中(请参阅下面的解决方法) 现在,我知道CON是表示STDIN的“文件”,并且TYPE CON将输出(echo)STDIN。在批处理文件中,这似乎根本不起作用。事实上,它似乎并不代表STDIN,而是通过键盘的用户/主机输入 测试.bat TYPE CON > ou

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

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

测试.bat

TYPE CON > output.txt
测试运行:

C:>TYPE myfile.txt | test.bat
预期结果:
myfile.txt
被复制到
output.txt

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

解决方法

解决方法:以下
test.bat可以工作,但不支持流式输入(例如,从
tail
命令):

更新:背景故事: 我有一个整洁的CMD,它使用powershell下载(通过HTTP)任意的.ps1脚本(就像包管理器一样)并动态执行它。如果我调用
REMEXEC.bat mymodule foo bar
,它将加载并执行
mymodule.ps1
,参数为
foo
bar

除管道、流式输入外,这对所有场景都非常有效。使用
findstr“^”
适用于管道输入,但不适用于开放流。使用say
AWK/*/
作为BAT的第一行,我得到了流式输入,但只是把问题推到了后面

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


第22个问题是
下载psmodule
发生在
executePSModule
之前,因此无法访问STDIN(为BAT的第一行保留的特权)。

如果需要从控制台检索输入或从STDIN流隔离读取以不使用管道数据,我会尝试直接从控制台阅读,比如

@echo关闭
setlocal enableextensions disabledelayedexpansion
rem部件,从控制台读取,而不是管道输入
执行时

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 ""
W:\>type test.cmd | test.cmd
键入:这是一个测试
您已键入:[这是一个测试]
@回音
setlocal enableextensions disabledelayedexpansion
rem部件,从控制台读取,而不是管道输入
你看到这个了吗?还有这个?我想如果你提供具体的任务,以及实际的可执行文件、命令和代码,我们会更容易帮助你。是的,我得到了@Squashman的信息,似乎没有办法访问STDIN(CON不是吗)。@Compo,我添加了一些背景故事。实际结果:批处理等待用户输入(忽略通过管道传输到它的内容)并将用户在键盘上输入的内容写入output.txt.Yep,这是正确的,您告诉我们将键入的内容放入一个文件中。键入完文件后按Ctrl+Z告诉它。我绝对不想从控制台读取-我想要管道式的输入流。@Marc,我不确定我是否理解这个问题。这是代码只是表明在执行另一个代码后检索管道数据没有任何问题。只需确保“初始”命令不会通过分配不同的输入源来使用管道数据。这样,管道数据将可用于读取它的“最终”命令。这不是要解决的问题吗?
downloadPSModule( "http://myrepo.com/modules/%1.ps1" )
STDIN | executePSModule %2 %3 %4
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 ""