如何在批处理脚本中测试文件是否是目录?

问题描述 投票:0回答:9

有什么办法可以判断一个文件是否是一个目录?

我将文件名放在变量中。在 Perl 中我可以这样做:

if(-d $var) { print "it's a directory\n" }
windows batch-file cmd
9个回答
111
投票

这有效:

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

孩子们,在家尝试是安全的!


74
投票

最近采用与上述不同的方法失败了。很确定他们过去工作过,可能与这里的 dfs 有关。现在使用文件属性并剪切第一个字符

@echo off
SETLOCAL ENABLEEXTENSIONS
set ATTR=%~a1
set DIRATTR=%ATTR:~0,1%
if /I "%DIRATTR%"=="d" echo %1 is a folder
:EOF

61
投票

你可以这样做:

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

(注意 - 上面给出的示例采用的是在批处理文件中工作的格式。要使其在命令行上工作,请将两个地方的

%%
替换为
%
。)


12
投票

除了我之前的产品之外,我发现这也有效:

if exist %1\ echo Directory

不需要 %1 左右的报价,因为调用者将提供它们。 与我一年前的回答相比,这节省了整个击键的时间;-)


11
投票

这是一个使用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

6
投票

这个效果非常好

if exist "%~1\" echo Directory

我们需要使用 %~1 删除 %1 中的引号,并在末尾添加反斜杠。然后再次将整个放入 qutes 中。


4
投票
当指定的目录不存在时,

CD
返回
EXIT_FAILURE
。你得到了条件处理符号,所以你可以像下面这样做。

SET cd_backup=%cd%
(CD "%~1" && CD %cd_backup%) || GOTO Error

:Error
CD %cd_backup%

4
投票

@batchman61 方法的变体(检查目录属性)。

这次我使用外部“查找”命令。

(哦,请注意

&&
技巧。这是为了避免冗长无聊的
IF ERRORLEVEL
语法。)

@ECHO OFF
SETLOCAL EnableExtensions
ECHO.%~a1 | find "d" >NUL 2>NUL && (
    ECHO %1 is a directory
)

输出“是”:

  • 目录。
  • 目录符号链接或连接。
  • 损坏的目录符号链接或连接。 (不尝试解析链接。)
  • 您没有读取权限的目录(例如“C:\System Volume Information”)

3
投票

NUL 技术似乎只适用于 8.3 兼容的文件名。

(换句话说,`D:\Documents and Settings` 是“坏”,而 `D:\DOCUME~1` 是“好”)


我认为当目录名称中有空格时使用“NUL”技术会有些困难,例如“Documents and Settings”。

我正在使用 Windows XP Service Pack 2 并从 %SystemRoot%\system3 启动 cmd 提示符

© www.soinside.com 2019 - 2024. All rights reserved.