有什么办法可以判断一个文件是否是一个目录?
我将文件名放在变量中。在 Perl 中我可以这样做:
if(-d $var) { print "it's a directory\n" }
这有效:
if exist %1\* echo Directory
适用于包含空格的目录名称:
C:\>if exist "c:\Program Files\*" echo Directory
Directory
请注意,如果目录包含空格,则需要引号:
C:\>if exist c:\Program Files\* echo Directory
也可以表示为:
C:\>SET D="C:\Program Files"
C:\>if exist %D%\* echo Directory
Directory
孩子们,在家尝试是安全的!
最近采用与上述不同的方法失败了。很确定他们过去工作过,可能与这里的 dfs 有关。现在使用文件属性并剪切第一个字符
@echo off
SETLOCAL ENABLEEXTENSIONS
set ATTR=%~a1
set DIRATTR=%ATTR:~0,1%
if /I "%DIRATTR%"=="d" echo %1 is a folder
:EOF
你可以这样做:
IF EXIST %VAR%\NUL ECHO It's a directory
但是,这只适用于名称中没有空格的目录。当您在变量周围添加引号来处理空格时,它将停止工作。要处理带有空格的目录,请将文件名转换为短 8.3 格式,如下所示:
FOR %%i IN (%VAR%) DO IF EXIST %%~si\NUL ECHO It's a directory
%%~si
将 %%i
转换为 8.3 文件名。要查看可以使用 FOR
变量执行的所有其他技巧,请在命令提示符下输入 HELP FOR
。
(注意 - 上面给出的示例采用的是在批处理文件中工作的格式。要使其在命令行上工作,请将两个地方的
%%
替换为 %
。)
除了我之前的产品之外,我发现这也有效:
if exist %1\ echo Directory
不需要 %1 左右的报价,因为调用者将提供它们。 与我一年前的回答相比,这节省了整个击键的时间;-)
这是一个使用FOR构建完全限定路径的脚本,然后pushd来测试该路径是否是目录。请注意它如何适用于带有空格的路径以及网络路径。
@echo off
if [%1]==[] goto usage
for /f "delims=" %%i in ("%~1") do set MYPATH="%%~fi"
pushd %MYPATH% 2>nul
if errorlevel 1 goto notdir
goto isdir
:notdir
echo not a directory
goto exit
:isdir
popd
echo is a directory
goto exit
:usage
echo Usage: %0 DIRECTORY_TO_TEST
:exit
将上述内容保存为“isdir.bat”的示例输出:
C:\>isdir c:\Windows\system32
is a directory
C:\>isdir c:\Windows\system32\wow32.dll
not a directory
C:\>isdir c:\notadir
not a directory
C:\>isdir "C:\Documents and Settings"
is a directory
C:\>isdir \
is a directory
C:\>isdir \\ninja\SharedDocs\cpu-z
is a directory
C:\>isdir \\ninja\SharedDocs\cpu-z\cpuz.ini
not a directory
这个效果非常好
if exist "%~1\" echo Directory
我们需要使用 %~1 删除 %1 中的引号,并在末尾添加反斜杠。然后再次将整个放入 qutes 中。
CD
返回EXIT_FAILURE
。你得到了条件处理符号,所以你可以像下面这样做。
SET cd_backup=%cd%
(CD "%~1" && CD %cd_backup%) || GOTO Error
:Error
CD %cd_backup%
@batchman61 方法的变体(检查目录属性)。
这次我使用外部“查找”命令。
(哦,请注意
&&
技巧。这是为了避免冗长无聊的 IF ERRORLEVEL
语法。)
@ECHO OFF
SETLOCAL EnableExtensions
ECHO.%~a1 | find "d" >NUL 2>NUL && (
ECHO %1 is a directory
)
输出“是”:
我认为当目录名称中有空格时使用“NUL”技术会有些困难,例如“Documents and Settings”。
我正在使用 Windows XP Service Pack 2 并从 %SystemRoot%\system3 启动 cmd 提示符