我刚刚了解到,如果文件是链接,这是在批处理文件中进行测试的方法:
dir %filename% | find "<SYMLINK>" && (
do stuff
)
如果目录是符号链接,我怎么能做一个类似的技巧来测试。将<SYMLINK>
替换为<SYMLINKD>
并不起作用,因为dir %directoryname%
列出了目录的内容,而不是目录本身。
似乎我需要某种方式让dir告诉我有关目录的方式,如果我在父目录中询问的话。 (就像ls -d
在unix中所做的那样)。
或者任何其他测试目录是否为符号链接的方式?
谢谢!
答案 0 :(得分:15)
使用符号链接/联结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%
,因此您也可以检查“有效错误”!
答案 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. )