Batch file 捕获通过管道传输到批处理文件的真实STDIN
我想在执行其他一些命令之后,从批处理文件中访问STDIN。我知道.BAT文件中的第一个命令接收STDIN,但我想先运行一些其他命令,然后捕获STDIN。我还希望它能够与流式STDIN一起使用,即在开始时不接受将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
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“^”
适用于管道输入,但不适用于开放流。使用sayAWK/*/
作为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 ""