@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上运行,但我只在Win7上进行了测试。
编辑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
最后-一个测试,真正应该工作在任何Windows版本从XP开始,包括与网络驱动器和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
)
@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
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".
@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
6条答案
按热度按时间cs7cruho1#
我知道
if exist path\nul
测试用于在MS-DOS上工作的文件夹。我不知道它是否被打破与引入长文件名。我知道
if exist "long path\nul"
在Windows批处理上不起作用。我直到今天才意识到,只要path是短的8.3形式,if exist path\nul
就可以在Vista和更高版本上工作。原始代码似乎在Vista上工作。看起来它也应该能在XP上工作,但我相信下面的XP bug会妨碍它:Batch parameter %~s1 gives incorrect 8.3 short name。
原始代码不需要FOR循环,它可以简单地使用
%~s1
下面是一个变体,它将路径完全分类为INVALID、FILE或FOLDER。它在Vista上工作,但在XP上不工作,因为X1 M4 N1 X错误。我不知道它在MS-DOS上的表现如何。
编辑2015-12-08:在许多Windows情况下,这会失败
我相信这个变体将与几乎所有版本的Microsoft批处理,包括MS-DOS和XP。(它显然不会在不支持PUSHD的早期版本的DOS上工作)
更新2014-12-26
我很确定以下内容可以在XP以后的所有版本的Windows上运行,但我只在Win7上进行了测试。
编辑2015-12-08:这可能会失败的网络驱动器,因为文件夹测试可以错误地报告一个文件作为文件夹
更新2015-12-08
最后-一个测试,真正应该工作在任何Windows版本从XP开始,包括与网络驱动器和UNC路径
注意-此技术旨在用于没有任何通配符的路径(单个特定文件或文件夹)。如果提供的路径包括一个或多个通配符,则它提供文件系统遇到的第一个文件或文件夹的结果。相同的目录结构可能会根据底层文件系统(FAT32、NTFS等)给予不同的排序顺序结果。
xfyts7mz2#
我只是用这种方式尝试。希望这能帮上忙。
输出:
9bfwbjaz3#
“dir”命令的/ad选项列出文件夹,/B选项列出空文件夹。假设您已检查文件是否存在,请用途:
p4rjhz4m4#
对于1内衬:
例如,将
C:\Windows
更改为C:\Windows\Notepad.exe
p1tboqfb5#
以前,我使用
"\nul"
方法,但现在很长一段时间,我都使用"\*"
来测试现有的filespec是文件夹还是文件。据我所知,它适用于所有版本的Windows,从Windows 95(也许还有更早的版本)到所有当前的Windows版本。因此,与其他方法一样,首先测试文件是否存在。然后,要查看它是否是一个“文件夹”,请使用以下方法进行测试:
if exist "%fspec%\*"
:例如:
其输出为:
xuo3flqw6#
This solution将文件属性parameter extension(
%~a1
)与variable substring extraction(%variable:~0,1%
)组合:输出: