In Windows, either in command line or a batch file, the command DIR 2>NUL: 3>&2 (you can replace DIR with anything, even if isn\'t a file
I apologize for post this as an answer instead of a comment, but my "comment" is too large...
In the MS-DOS standard, all running programs have open these Standard Handles: 0-STDIN (keyboard), 1-STDOUT (screen), 2-STDERR (screen), 3-STDAUX (serial port) and 4-STDPRN (printer). Although Windows documentation clearly indicate that handles 3-9 are undefined, handle 3 have a special treatment by CMD.EXE. I have three reasons to think this:
1- Handle 3 is connected to CON: device (keyboard for input, screen for output); handles 4-9 does not:
C>ver
Microsoft Windows XP [Version 5.1.2600]
C>echo To handle 3 >&3
To handle 3
C>echo To handle 4 >&4
The handle could not be duplicated
during redirection of handle 1.
C>set /P var=From handle 3: <&3
From handle 3: Value entered in keyboard
C>echo %var%
Value entered in keyboard
C>set /P var=From handle 4: <&4
The handle could not be duplicated
during redirection of handle 0.
2- The strange behavior of handle 3 stated in the present topic, that was solved in two differents ways. I discovered that if handles 0, 1 or 2 are redirected with handle 3 (and possibly handles 4-9), the redirection of handles 0, 1 or 2 becomes "permanent"; this behaviour doesn't happens if the handle 0, 1 or 2 are the last handle(s) in the list of redirections that include handle 3. This problem is entirely avoided if handles 0, 1 or 2 are redirected with handles 4-9 in any order, but not handle 3.
3- The results obtained with my TypeOfHandle.com program. This program is a pure MS-DOS executable file that check the handle given in its parameter and return via errorlevel a value of 3 if the handle is connected to the CONsole device, or a value of 128 if the handle is redirected to a disk file. These are the results:
C>typeofhandle 0
C>echo %errorlevel%
3
C>typeofhandle 0 < anyFile.txt
C>echo %errorlevel%
128
C>typeofhandle 1
C>echo %errorlevel%
3
C>typeofhandle 1 > anyFile.txt
C>echo %errorlevel%
128
C>typeofhandle 3
C>echo %errorlevel%
0
C>typeofhandle 3 <&3 anyFile.txt
C>echo %errorlevel%
0
C>typeofhandle 3 >&3 anyFile.txt
C>echo %errorlevel%
0
Handles 3-9 behaves strange in other aspect:
The results obtained with my SetFilePointer.com program. Although handles 3-9 may be used in a Batch file to achieve input/output from/to several files at once, such mechanism only allows sequential access because my SetFilePointer program can't move the File Pointer of handles 3-9. SetFilePointer program correctly works on handles 0, 1 and 2; this feature allows to write a complete Relational Database application in Batch. This topic is described in detail at this post