是否有办法查找一个文件是否是目录?
我有一个存储在变量中的文件名,在Perl中,我可以这样做:
if(-d $var) { print "it's a directory\n" }
是否有办法查找一个文件是否是目录?
我有一个存储在变量中的文件名,在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
%1
扩展到文件/文件夹的完整路径。我必须使用%~f1
。它会将像.
和..
这样的路径扩展为实际路径。 - WesternGun您可以这样做:
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
。
(注意-上面给出的示例是为批处理文件格式而设计的。要在命令行上运行它,请在两个位置将 %%
替换为 %
。)
cmd
<Ctrl>+<Shift>+<Enter> mklink /d LinkDir .
<Enter> cd LinkDir
<Enter> if exist regedt32.exe\nul echo File erroneously detected as Directory
<Enter> rd .
- Aaron Thoma继我的先前回答之后,我发现这也可以正常工作:
if exist %1\ echo Directory
不需要在%1周围加引号,因为调用者会提供它们。这比我一年前的答案节省了一个按键;-)
cmd
<Ctrl>+<Shift>+<Enter> mklink /d LinkDir .
<Enter> cd LinkDir
<Enter> if exist regedt32.exe\ echo File erroneously detected as Directory
<Enter> rd .
- Aaron Thoma这是一个使用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
\
…``行内代码格式的解析方式。) « »本应该是«
`` »。 我指的是在文件名末尾添加反斜杠的方法,例如在此处提出的建议:https://dev59.com/unVC5IYBdhLWcg3w9F89#143935?noredirect=1#answer-3845794 - Aaron Thoma这完美地运行。
if exist "%~1\" echo Directory
cmd
<Ctrl>+<Shift>+<Enter>mklink /d LinkDir .
<Enter>cd LinkDir
<Enter>if exist "regedt32.exe\" echo File erroneously detected as Directory
<Enter>rd .
- Aaron ThomaCD
命令在指定的目录不存在时返回EXIT_FAILURE
。如果您使用条件处理符号,您可以像下面这样进行操作。
SET cd_backup=%cd%
(CD "%~1" && CD %cd_backup%) || GOTO Error
:Error
CD %cd_backup%
这是@batchman61方法的变体(检查目录属性)。
这次我使用了外部的“find”命令。
(哦,注意那个&&
技巧。这是为了避免冗长乏味的IF ERRORLEVEL
语法。)
@ECHO OFF
SETLOCAL EnableExtensions
ECHO.%~a1 | find "d" >NUL 2>NUL && (
ECHO %1 is a directory
)
对以下情况输出yes:
这个功能可以处理路径中带有空格的情况:
dir "%DIR%" > NUL 2>&1
if not errorlevel 1 (
echo Directory exists.
) else (
echo Directory does not exist.
)
在我看来,这可能不是最高效的解决方案,但比其他解决方案更易读。
cd
命令进入该目录... 当然,在执行该命令之前,记得先保存当前目录,以便稍后恢复... - Frank Ndir "%DIR%" /A:D > NUL 2>&1
来使得dir
在处理文件时退出错误代码不等于0。 - Michael Podlejskaif not [%1] == [] (
pushd %~dpn1 2> nul
if errorlevel == 1 pushd %~dp1
)