Discussion forum for all Windows batch related topics.
Moderator: DosItHelp
-
lockedscope
- Posts: 31
- Joined: 12 Jun 2020 10:38
#1
Post
by lockedscope » 18 Jul 2020 03:31
Handle2 writes to console because stderr is connected to stdout by default. Is this right?
And piped commands could only read from stdin which comes from the stdout of the piping command. So, stderr is not connected to stdout when piping. Is this right?
Code: Select all
(
echo Output1
echo Output2 >&2
)
echo --- With piping
(
echo Output1
echo Output2 >&2
) | (echo # Running findstr & findstr /A:4E /N "^")
### Result
Output1
Output2
--- With piping
Output2
# Running findstr
1:Output1
-
aGerman
- Expert
- Posts: 4678
- Joined: 22 Jan 2010 18:01
- Location: Germany
#2
Post
by aGerman » 18 Jul 2020 05:09
STDin references CONin by default, both STDout and STDerr reference CONout by default. You might imagine the console was a file. You can read it and you can write it. Only these two operations.
Redirections and pipes can only use one STD handle at a time. While you are able to specify the file descriptor (0, 1, 2, ...) for the implementation of redirections, pipes use always stdout on one end and stdin on the other end. That means you have to merge stderr into stdout if you want to process stderr in a pipe. Technically a pipe could also be connected to stderr directly but this feature isn't implemented in the CMD. I'm afraid to understand the details you would have to dig in the Windows API.
Steffen