DOS "IF EXIST Z: \NUL" Fails on HPFS Servers (77361)
This article was previously published under Q77361
SYMPTOMS
Using the MS-DOS COMMAND.COM batch language IF EXIST <filespec>
construct, using a <filespec> of Z:\NUL (where Z: is a remote drive
that is not using the FAT file system), the IF EXIST will fail.
Variations of this IF EXIST are often used (incorrectly) as
presence checks for remote drive letters or remote subdirectories.
Using Z:\NUL will fail on LAN Manager HPFS servers. It will also
probably fail on any remote drive that neither is DOS-based nor
emulates the MS-DOS-centric behavior of making all character
devices available at all portions in the file system (that is,
ignoring the drive letter and optional path when the base filename
is an MS-DOS device name).
Using Z:\*.* (that is, using "*.*" instead of "NUL") works on all
tested servers, as long as there is at least one file in that
subdirectory (the special directory files "." and ".." do not count
in this case).
Using Z:\NUL on local MS-DOS drives or remote drives on MS-DOS
MS-Net servers (both of which are running MS-DOS, and thus, FAT
file systems) will work.
Using Z:\NUL on LAN Manager servers that have FAT file system
shares will also work.
Using Z:\NUL on LAN Manager servers that have HPFS file system
shares WILL work if a FILE (not a device) called NUL exists that
allows the check to work.
Using IF EXIST under OS/2's CMD.EXE command interpreter will work;
however, this is due to differences of behavior in CMD.EXE.
This problem occurs on all versions of MS-DOS.
CAUSE
The use of Z:\NUL tells MS-DOS to look for a local character device
on a remote block device. Thus, DOS tells the LAN Manager
redirector to ask the remote server to find this file (using
DosFindFirst() under OS/2 LAN Manager servers). Because there is no
device (or probably no file) on HPFS drives, this fails, and the
error is propagated back from the server to MS-DOS, via the
redirector.
RESOLUTION
To work around this problem, write a program that uses the MS-DOS
Get Current Drive (interrupt 21h ah=19h) and Set Current Drive
(interrupt 21h ah=0Eh) functions to check a drive letter for
validity, and return an ERRORLEVEL, which can be tested in DOS's
batch language.
Modification Type: |
Major |
Last Reviewed: |
7/30/2001 |
Keywords: |
KB77361 |
|