如何测试路径是Windows批处理文件中的文件或目录?

aar*_*ron 15 windows batch-file

我在这里搜索,发现有人用这个

set is_dir=0
for %%i in ("%~1") do if exist "%%~si"\nul set is_dir=1
Run Code Online (Sandbox Code Playgroud)

但没有工作,当时%1==c:\this is a file with spaces.csproj,测试仍然成功,这意味着它仍将被视为文件夹!!!

任何人都知道答案,我想这是一个非常普遍的问题,Windows已存在多年,它应该有一个非常简单的解决方案....

dbe*_*ham 31

我知道if exist path\nul测试用于在MS-DOS上工作的文件夹.我不知道它是否因引入长文件名而被打破.

我知道这if exist "long path\nul"对Windows批处理不起作用.直到今天,我才意识到if exist path\nul只要路径是短的8.3形式,它就可以在Vista上运行.

原始代码似乎适用于Vista.它似乎也适用于XP,但我相信以下XP错误正在阻碍:批处理参数%~s1给出错误的8.3短名称.

原始代码不需要FOR循环,它可以简单地使用 %~s1

以下是将路径完全分类为INVALID,FILE或FOLDER的变体.它可以在Vista上运行,但由于这个%~s1bug ,它不适用于XP .我不确定它在MS-DOS上的表现如何.
编辑2015-12-08:有许多Windows失败的情况

@echo off
if not exist "%~1" ( set "type=INVALID" ) else if exist %~s1\nul ( set "type=FOLDER" ) else ( set "type=FILE" )
@echo "%~1" = %type%
Run Code Online (Sandbox Code Playgroud)

我相信这种变体适用于几乎所有版本的Microsoft批处理,包括MS-DOS和XP.(它显然不适用于不支持PUSHD的DOS早期版本)

@echo off
if exist "%~1" (2>nul pushd "%~1" && (popd&set "type=FOLDER") || set "type=FILE" ) else set "type=INVALID"
echo "%~1" = %type%
Run Code Online (Sandbox Code Playgroud)

更新2014-12-26

我很确定以下内容适用于从XP开始的所有Windows版本,但我只在Win 7上测试过.
编辑2015-12-08:这可能会在网络驱动器上失败,因为文件夹测试可能会错误地将文件报告为一个文件夹

@echo off
if exist %1\ (
  echo %1 is a folder
) else if exist %1 (
  echo %1 is a file
) else (
  echo %1 does not exist
)
Run Code Online (Sandbox Code Playgroud)

更新2015-12-08

最后 - 一个真正应该适用于XP以后的任何Windows版本的测试,包括网络驱动器和UNC路径

for /f "tokens=1,2 delims=d" %%A in ("-%~a1") do if "%%B" neq "" (
  echo %1 is a folder
) else if "%%A" neq "-" (
  echo %1 is a file
) else (
  echo %1 does not exist
)
Run Code Online (Sandbox Code Playgroud)


Vaa*_*ndu 7

我只是这样试过.希望这可以帮助.

@ECHO OFF
SET CURR_DIR=%CD%
SET IS_DIR=0
CD %1% 
IF "%ERRORLEVEL%"=="0" SET IS_DIR=1
CD %CURR_DIR%
ECHO IS DIRECTORY %IS_DIR% 
Run Code Online (Sandbox Code Playgroud)

输出:

D:\Work\Stand alone Java classes>test.bat D:\Work\Training
IS DIRECTORY 1

D:\Work\Stand alone Java classes>test.bat D:\Work\Training\SRT.txt
The directory name is invalid.
IS DIRECTORY 0
Run Code Online (Sandbox Code Playgroud)

  • 万分感谢!我把它做得更短: `PUSHD %1 2>NUL && SET IS_DIR=1 || 设置 IS_DIR=0 & POPD` (3认同)