半年ぶりの続きである。なかなか奥が深い。約1年前に、このような表を作った。
if exist FILE | 真 | if exist DIR | 真 | if exist NONE | 偽 |
if exist FILE\ | 偽 | if exist DIR\ | 真 | if exist NONE\ | 偽 |
if exist FILE\. | 真 | if exist DIR\. | 真 | if exist NONE\. | 偽 |
if exist FILE\\ | 偽 | if exist DIR\\ | 真 | if exist NONE\\ | 偽 |
if exist FILE\.\ | 偽 | if exist DIR\.\ | 真 | if exist NONE\.\ | 偽 |
ここでFILEは普通のファイル、DIRはディレクトリ、NONEはファイルとして存在しない名前。
しかし、対象がネットワーク共有名またはネットワークドライブの内部だとこの通り行かない。
if exist FILE | 真 | if exist DIR | 真 | if exist NONE | 偽 |
if exist FILE\ | 真 | if exist DIR\ | 真 | if exist NONE\ | 偽 |
if exist FILE\. | 真 | if exist DIR\. | 真 | if exist NONE\. | 偽 |
if exist FILE\\ | 真 | if exist DIR\\ | 真 | if exist NONE\\ | 偽 |
if exist FILE\.\ | 真 | if exist DIR\.\ | 真 | if exist NONE\.\ | 偽 |
ここでFILEやDIRは実際には "\\ホスト名\共有名\FILE" またはネットワークドライブ X: に対して "X:\FILE" 等である。
つまり、ファイルとディレクトリの区別が付かない。また、\NUL を付加する方法でも駄目である。
したがって、ネットワーク共有先も含めて考えるなら、やはり if exist では駄目で、前回書いたように、
dir /b/ad FILE >NUL 2>NUL && echo ディレクトリ if exist FILE dir /b/ad FILE >NUL 2>NUL || echo 普通のファイル
のような方法を取る必要がある。