[英]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 中所做的那樣)。
或者任何其他測試目錄是否是符號鏈接的方法?
謝謝!
將符號鏈接/連接與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
!
使用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
使用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.