我在这里搜索,发现有人用这个
set is_dir=0
for %%i in ("%~1") do if exist "%%~si"\nul set is_dir=1
但是没有用,当
%1==c:\this is a file with spaces.csproj
时,测试仍然成功,这意味着它仍然会被视为一个文件夹!!!
任何人都知道答案,我想这是一个非常普遍的问题,Windows 已经存在很多年了,它应该有一个非常简单的解决方案....
我知道
if exist path\nul
测试用于在 MS-DOS 上工作的文件夹。不知道是不是因为长文件名的引入而被打破了
我知道
if exist "long path\nul"
在 Windows 批处理上不起作用。直到今天我才意识到 if exist path\nul
只要路径是短的 8.3 形式就可以在 Vista 和更高版本上工作。
原始代码似乎可以在 Vista 上运行。它似乎也应该在 XP 上工作,但我相信以下 XP 错误正在阻碍:Batch parameter %~s1 gives incorrect 8.3 short name.
原代码不需要FOR循环,直接用
%~s1
这是一个变体,将路径完全分类为 INVALID、FILE 或 FOLDER。它适用于 Vista,但由于
%~s1
错误而不适用于 XP。我不确定它在 MS-DOS 上的表现如何。@echo off
if not exist "%~1" ( set "type=INVALID" ) else if exist %~s1\nul ( set "type=FOLDER" ) else ( set "type=FILE" )
@echo "%~1" = %type%
我相信这种变体适用于几乎所有版本的 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%
更新 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
)
更新 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
)
注意 - 此技术旨在用于没有任何通配符的路径(单个特定文件或文件夹)。如果提供的路径包含一个或多个通配符,则它提供文件系统遇到的第一个文件或文件夹的结果。相同的目录结构可能会根据底层文件系统(FAT32、NTFS 等)给出不同的排序顺序结果
我就是这样试的。希望这会有所帮助。
@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%
输出:
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
“dir”命令的 /ad 选项列出文件夹,/b 选项用于裸。假设您已检查文件是否存在,请使用:
dir /ad /b ChangeThisToYourFilename 1> NUL 2> NUL
if %ERRORLEVEL% EQU 0 (
echo is a folder
) else (
echo is NOT a folder
)
对于 1 班轮:
dir /a:d /b C:\Windows 2>&1 | findstr /i /n /c:"File Not Found">nul && (@echo. Im a file) || (@echo. Im a folder)
例如把
C:\Windows
改成C:\Windows\Notepad.exe
-对不起阿伦,dbenham,没有读你的!和..一样
之前,我使用
"\nul"
方法,但很长一段时间以来,我一直使用"\*"
来测试现有的filespec是文件夹还是文件。据我所知,它适用于所有版本的 Windows,从 Windows 95(可能还有更早的版本)到所有当前的 Windows 版本。
因此,与其他方法一样,首先测试文件是否存在。然后,要查看它是否是“文件夹”,请使用以下命令进行测试:
if exist "%fspec%\*"
:
if not exist "%fspec%" goto :NotExistOrInvalid
rem "%fspec%" is "Valid" and is either a "Folder", or a "File".
if exist "%fspec%\*" goto :IsValidAndIsAFolder
rem "%fspec%" is a "File" (a "Regular File" or a Shortcut/Link).
goto :IsValidAndIsAFile
例如:
set "fspec=XYZ:%perlpath%"
if not exist "%fspec%" echo "%fspec%": Invalid or not found && rem Invalid, goto :NotExistOrInvalid
set "fspec=%perlpath%"
if not exist "%fspec%" echo "%fspec%": Invalid or not found && rem goto :NotExistOrInvalid
rem "%fspec%" Is a "Valid" filespec and is either a "Folder", or a "File".
if exist "%fspec%\*" (echo "%fspec%" is a "Folder".) else echo "%fspec%" is a "File".
set "fspec=%perlpath%\perl.exe"
if not exist "%fspec%" echo "%fspec%": Invalid or not found && rem Invalid, goto :NotExistOrInvalid
rem "%fspec%" Is a "Valid" filespec and is either a "Folder", or a "File".
if exist "%fspec%\*" (echo "%fspec%" is a "Folder".) else echo "%fspec%" is a "File".
这个的输出是:
"XYZ:F:\usr\perl\bin": Invalid or not found
"F:\usr\perl\bin" is a "Folder".
"F:\usr\perl\bin\perl.exe" is a "File".
%~a1
)和变量子串提取(%variable:~0,1%
):
@ECHO OFF
CALL :is_directory C:\Windows
CALL :is_directory C:\MinGW\share\doc\mingw-get\README
CALL :is_directory C:\$Recycle.Bin
CALL :is_directory "C:\Documents and Settings"
CALL :is_directory "%LOGONSERVER%\C$\Users\All Users"
GOTO :EOF
:is_directory
SETLOCAL
SET file_attribute=%~a1
IF "%file_attribute:~0,1%"=="d" (
ECHO %file_attribute% %1 is a directory
) ELSE (
ECHO %file_attribute% %1 is NOT a directory
)
ENDLOCAL
GOTO :EOF
输出:
d-------- C:\Windows is a directory
--a------ C:\MinGW\share\doc\mingw-get\README is NOT a directory
d--hs---- C:\$Recycle.Bin is a directory
d--hs---l "C:\Documents and Settings" is a directory
d--hs---l "\\MYCOMPUTER\C$\Users\All Users" is a directory