批处理文件(windows cmd.exe)测试目录是否为链接(符号链接)

时间:2013-09-18 23:17:56

标签: windows batch-file directory symlink

我刚刚了解到,如果文件是链接,这是在批处理文件中进行测试的方法:

dir %filename% |  find "<SYMLINK>" && (
   do stuff
)

如果目录是符号链接,我怎么能做一个类似的技巧来测试。将<SYMLINK>替换为<SYMLINKD>并不起作用,因为dir %directoryname%列出了目录的内容,而不是目录本身。

似乎我需要某种方式让dir告诉我有关目录的方式,如果我在父目录中询问的话。 (就像ls -d在unix中所做的那样)。

或者任何其他测试目录是否为符号链接的方式?

谢谢!

8 个答案:

答案 0 :(得分:15)

您有三种方法

解决方案1:fsutil reparsepoint

使用符号链接/联结fsutil reparsepoint query并检查%errorlevel%是否成功,如下所示:

set tmpfile=%TEMP%\%RANDOM%.tmp

fsutil reparsepoint query "%DIR%" >"%tmpfile%"
if %errorlevel% == 0 echo This is a symlink/junction
if %errorlevel% == 1 echo This is a directory

这样可行,因为fsutil reparsepoint query无法在标准目录上执行任何操作并抛出错误。 但是,权限错误导致%errorlevel%=1

解决方案2:dir + find

列出父目录与dir的链接,使用find过滤输出并检查%errorlevel%是否成功,如下所示:

set tmpfile=%TEMP%\%RANDOM%.tmp

dir /AL /B "%PARENT_DIR%" | find "%NAME%" >"%tmpfile%"
if %errorlevel% == 0 echo This is a symlink/junction
if %errorlevel% == 1 echo This is a directory

解决方案3:for(最好)

使用for获取目录的属性并检查其中的最后一个,因为这表示链接。我认为,这是更聪明,最好的解决方案。

for %i in ("%DIR%") do set attribs=%~ai
if "%attribs:~-1%" == "l" echo This is a symlink/junction

仅供参考:此解决方案不依赖于%errorlevel%,因此您也可以检查“有效错误”!

来源

答案 1 :(得分:8)

一般代码:

fsutil reparsepoint query "folder name" | find "Symbolic Link" >nul && echo symbolic link found || echo No symbolic link

弄清楚,如果当前文件夹是符号链接:

fsutil reparsepoint query "." | find "Symbolic Link" >nul && echo symbolic link found || echo No symbolic link

弄清楚,如果父文件夹是符号链接:

fsutil reparsepoint query ".." | find "Symbolic Link" >nul && echo symbolic link found || echo No symbolic link

答案 2 :(得分:4)

实际上,如果你在文件名后附加一个星号,DIR就可以了:

dir %filename%* |  find "<SYMLINKD>" && (
   do stuff
)

当目录中有另一个与%filename%*匹配的条目时,GreenAsJade提醒我注意此解决方案的失败。我相信以下wiull在所有情况下都有效:

set MYPATH=D:\testdir1
set FILENAME=mylink
set FULL=%MYPATH%\%FILENAME%
set SP1=0
for /f "tokens=4,5 delims= " %%A IN ('dir /L /N %FULL%*') do (
    if %%B EQU %FILENAME% (
    if "%%A" EQU "<SYMLINKD>" set SP1=1
    )
)
if %sp1% EQU 0 echo It's not there.
if %sp1% EQU 1 echo BINGO!
Pause

答案 3 :(得分:2)

这也有效:

dir / al | find / i&#34; java&#34; | find / i&#34; junction&#34; &安培;&安培; (    echo目录是一个符号链接 )

答案 4 :(得分:1)

更新:这解决了我的任务,但正如评论者所说,dir将显示目录符号链接和目录连接。如果那里有路口,那么这是错误的答案。

简单dir /A:ld正常工作

dir /?

DIR [drive:][path][filename] [/A[[:]attributes]] …

/A          Displays files with specified attributes.  
attributes   D  Directories                R  Read-only files  
             H  Hidden files               A  Files ready for archiving  
             S  System files               I  Not content indexed files  
             L  Reparse Points             -  Prefix meaning not  

答案 5 :(得分:1)

用于Windows 10的简单示例脚本。

信息:如果在%localappdata%\MegaDownloader文件夹中以 SymLink 的形式存在,请执行 MegaDownloader.exe 。如果%localappdata%\MegaDownloader中不存在SymLink,请使用mklink创建当前文件夹到PortableData的SymLink %localappdata%\MegaDownloader路径,然后运行 MegaDownloader.exe < / em>。

fsutil reparsepoint query "%localappdata%\MegaDownloader" | find "Substitute" >nul && GOTO MD || mklink /D /J "%localappdata%\MegaDownloader" "%cd%\PortableData" >nul 2>&1
    
:MD
"%~dp0\MegaDownloader.exe"

答案 6 :(得分:0)

以下batch file(reparse.bat)中显示了相应的 DIR命令 -

  ::  Specify the Directory to search
  SET directory=C:\Users\%username%\Desktop\TEST1

  ::  Results Text
  echo SEARCH OF DIRECTORY FOR REPARSE POINTS & echo.

  ::  List files with ATTRIBUTE L (Reparse Points)
  DIR "%directory%" /A:L

  echo. && echo  Notes - && echo.
  echo  There are 3 types of Reparse points: && echo.
  echo  ^<JUNCTION^> is a Directory Junction
  echo  ^<SYMLINKD^> is a Directory SymLink
  echo  ^<SYMLINK^>  is a File SymLink
  echo. && echo.

答案 7 :(得分:0)

另一种方法是在以下batch file(reparse2.bat)中处理三种类型的重新分析点中的每一种,可以很容易地修改它们以仅搜索您感兴趣的链接类型 -

  ::  Directory to Search
  SET directory=C:\Users\%username%\Desktop\TEST1

  ::  Results Text
  echo SEARCH OF DIRECTORY: %directory% & echo.

  ::  Find FILE SymLinks in directory
  dir "%directory%" | find "<SYMLINK>" && (
    echo This is a SymLink FILE
  ) && ( echo. )

  ::  Find DIRECTORY SymLinks in directory
  dir "%directory%" | find "<SYMLINKD>" && (
    echo This is a SymLink DIRECTORY
  ) && ( echo. )

  ::  Find JUNCTIONS in directory
  dir "%directory%" | find "<JUNCTION>" && (
    echo This is a Directory JUNCTION
  ) && ( echo. ) && ( echo. )