批处理脚本:进程试图写入一个不存在的管道

batch script: The process tried to write to a nonexistent pipe

@echo off
(for /f "skip=1 tokens=3,5,11" %%a in (Data.txt) do (if /i "%%c"=="%1" (if %%b==%2 echo %%a))
echo EXIT
)|Sum.exe

我正在尝试编写一个简单的批处理脚本,它将获取包含数据列 (Data.txt) 的 .txt 文件,使用 'if' 查找一些值并将所有找到的值重定向到标准输入输入“Sum.exe”。

“EXIT”也被重定向,因为它意味着没有更多的输入要给出。

当我 运行 上面的代码首先在控制台打印发现值,然后多次打印“进程试图写入不存在的管道”消息错误。因此 echo EXIT 一定是在搞乱 |Sum.exe。如何正确地将 for 和 echo Exit 重定向到 Sum?

编辑:

好的,这是 Sum 程序的输入部分(用 c++ 编写)

std::string a;
while (a != "EXIT")
{
    std::cin >> a;
    if (isNumber(a))
    add(sum, std::stoi(a));
}

我添加了 cout 以查看是否正在处理数据,似乎批处理脚本中的命令也被视为输入。

我的第一个建议是过程调用:call :PROCEDURE。但是调用不适用于管道重定向。 例如call :PROCEDURE | SORTreturn错误:Invalid attempt to call batch label outside of batch script.

所以我建议使用输入参数作为切换标志来调用自批处理。例如,它将是第三个参数:%3。当第三个参数等于 x.

时,Batch 调用自身

所以我做了这个代码

@echo off

if "%3"=="x" (%~nx0  %1 %2|sort )& GOTO :EOF

for /f "skip=1 tokens=3,5,11" %%a in (Data.txt) do (
if /i "%%c"=="%1" (if %%b==%2 echo %%a)
echo EXIT
)

我在示例中使用了 sort.exe 实用程序。将其更改为您的 sum.exe 要调用 batch-file,请使用语法:my_batch.cmd [value11] [value5] x

P.S。我认为您不需要在输出中使用单词 EXIT,但我将其留在了示例代码中。