簡體   English   中英

批處理文件 (windows cmd.exe) 測試目錄是否為鏈接(符號鏈接)

[英]batch file (windows cmd.exe) test if a directory is a link (symlink)

我剛剛了解到這是一種在批處理文件中測試文件是否為鏈接的方法:

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

我如何做一個類似的技巧來測試一個目錄是否是一個符號鏈接。 僅將<SYMLINK><SYMLINKD><SYMLINKD> ,因為dir %directoryname%列出了目錄的內容,而不是目錄本身。

似乎我需要某種方式讓 dir 告訴我有關目錄的信息,就像我在父目錄中詢問一樣。 (就像ls -d在 unix 中所做的那樣)。

或者任何其他測試目錄是否是符號鏈接的方法?

謝謝!

你有三種方法

解決方案 1:fsutil 重新解析點

將符號鏈接/連接與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過濾輸出並檢查%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 %i in ("%DIR%") do set attribs=%~ai
if "%attribs:~-1%" == "l" echo This is a symlink/junction

僅供參考:此解決方案不依賴於%errorlevel% ,因此您也可以檢查“有效錯誤”!

來源

通用代碼:

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

實際上,如果在文件名后附加星號,DIR 可以正常工作,因此:

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

當目錄中有另一個與 %filename%* 匹配的條目時,GreenAsJade 提醒我注意此解決方案的失敗。 我相信以下內容適用於所有情況:

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

這也有效:

dir /al|find /i "java"|find /i "junction" && ( echo 目錄是一個符號鏈接)

更新:這很好地解決了我的任務,但正如評論者指出的那樣, 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  

相應的DIR 命令顯示在以下批處理文件(reparse.bat) 中 -

  ::  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.

另一種方法是在以下批處理文件(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. )

適用於 Windows 10 的簡單示例腳本。

信息:如果它在%localappdata%\\MegaDownloader文件夾中作為SymLink存在,請執行MegaDownloader.exe 如果%localappdata%\\MegaDownloader中不存在 SymLink,則使用mklink創建當前文件夾的 SymLink PortableData路徑到%localappdata%\\MegaDownloader ,然后運行MegaDownloader.exe

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM