24

In Windows 7, how can I check if a file is a symbolic link or not, if a folder is a junction or not, and how can I check where they are pointing at (in case they are symlink/junction). Both in Explorer and in Command line.

It's very important to have a way to do it from command line, in order to know how to duplicate symbolic links on another computer when you want to make an exact replica of a folder tree.

If I right click on a file and check "Properties", I can't find any indication that it's a symbolic link.

migrated from stackoverflow.com Dec 27 '12 at 5:48

This question came from our site for professional and enthusiast programmers.

25

The dir command dir /a can do this:

2012-12-26  09:30 PM    <DIR>          .
2012-12-26  09:30 PM    <DIR>          ..
2012-12-26  09:30 PM                 0 a.txt
2012-12-26  09:30 PM    <SYMLINK>      link.txt [a.txt]

Alternatively, you can use Windows Explorer:

Right click column, More, Link Target
  • This doesn't work in windows 7 (Microsoft Windows [Version 6.1.7601]) – gonzalezea Mar 24 '16 at 14:00
  • 1
    @gonzalezea yeah, it does. It worked with Windows 7 back in 2012 when I posted this, and it works now too – Steven Penny Mar 24 '16 at 15:22
  • Perhaps not so obvious to new users, this is a command line solution. The user must open a command prompt, then change directory (using the CD command) to a directory containing a symbolic link, then type the DIR command and press the 'enter' key. Running the DIR command in the wrong directory is a common mistake. But understandable, unless you are sure which directory a symlink is in (not always obvious, as the Windows GUI does not explicitly tell you whether a particular directory contains any symlinks or junctions). Look for a shortcut that has the type FILE FOLDER instead of SHORTCUT. – Ed999 Jan 20 '17 at 16:28
  • 2
    The link target field is empty on windows 7 – Ronen Festinger Jul 10 '17 at 13:42
  • 1
    from the command line you should type in dir /a then press Enter. If you do not include the /a, windows does not list junction points. You can try the difference between dir and dir /a on directory \Users\YourUsername – Paulus Dec 21 '17 at 8:50
4

Copied from StackOverFlow, I just used this line, and it works

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

Explanation:

From MSDN about FSUtil : Performs tasks that are related to file allocation table (FAT) and NTFS file systems, such as managing reparse points, managing sparse files, or dismounting a volume. If it is used without parameters, fsutil displays a list of supported subcommands.

For our use, we just care that it outputs a line that has "Symbolic Link" in it, if it's symbolic, which we then find, and if find succeeds, we output one thing, if it doesn't, we output something else.

Notes:

  • The quotes around the folder name are required if the path has spaces in it.
  • It gives the same output whether the folder doesn't exist, or isn't a symlink, use with caution.
2

Using PowerShell, on at least Windows OS, you can find symbolic-links in any given directory, such as the following:

Get-ChildItem 'C:\nodejs\bin\' | Where-Object {$_.LinkType -eq 'SymbolicLink'}

A more concise alternative would be to use Get-ChildItem's alias ls:

ls 'C:\nodejs' -Attributes ReparsePoint -Recurse

And you can get relevant information on a symbolic-link by doing any of the following:

Get the file item and output its Target property. Target being the "value" of the symbolic-link. In an addition, method or command signatures for creating symlinks when juxtaposing between operating systems, the arguments names of: 'target', 'path' and/or 'value' may hold different meanings than another method signature on a different OS.

E:\AIT> Get-Item -Path 'C:\nodejs\bin\ionic.cmd' | Select-Object -ExpandProperty Target
E:\AIT\out\dependency_symlink.cmd

Get the file item and output its LinkType property. An item with a LinkType value of SymbolicLink means that its, well, symbolic.

E:\AIT> Get-Item -Path 'C:\nodejs\bin\ionic.cmd' | Select-Object -ExpandProperty LinkType
SymbolicLink

Get the file item and output its Mode property. An item with l in the Mode value indicates that it is a symbolic-link.

E:\AIT> Get-Item -Path 'C:\nodejs\bin\ionic.cmd' | Select-Object -ExpandProperty Mode
-a---l

Get the file item and output its Attributes property. An item attributed with a ReparsePoint value maybe indicative to a symbolic-link.

E:\AIT> Get-Item -Path 'C:\nodejs\bin\ionic.cmd' | Select-Object -ExpandProperty Attributes
Archive, ReparsePoint
1

Do not use fsutil to check if an item is a symbolic link or not. At first because errorlevel has errors, so sometimes, it stays to 0 and a real folder is viewed as a symbolic link. Errorlevel can not be trusted.

A problem with find is because find "Symbolic Link" is possible in English, but not in other languages.

The good way is to search from the attributes :

for %%i in ("%file_to_test%") do set attribute=%%~ai
set attribute=%attribute:~8,1%
if "%attribute%" == "l" (
    echo It's a symlink!
) else (
    echo Damned! It's real!
)

Attributes got with %a are "drahscotlep" and "l" is for symbolic link.

0

Here is a cygwin bash script to save symlinks, add your favourite folders to first line

find c:/ C:/Users/$USERNAME/SendTo C:/Users/$USERNAME/Desktop \
      -maxdepth 2 -type l \
      -printf 'mklink\t/D\t"%p"\t"%l"\n' | \
  perl -pne '\
      s!/cygdrive/(\w)/!\1:/!g;\
      s,/a/,/%USERNAME%/,g;\
      1;' | \
  sort -f | uniq  > restore-links.cmd
0

In Powershell:

dir | select Name, LinkType
  • 2
    Especially because this is an old question that already has good answers, explaining what your answer adds and what each portion of the command is doing is an easy way to make it better. – music2myear Jun 8 '18 at 22:00
0

all credits to @SecurityAndPrivacyGuru , [cmd]

complete batch script/function that reads symlink{|s in folder} and outputs list with them and their target paths

@echo off
setlocal enableExtensions enableDelayedExpansion
cd /D "%~dp0"
set br=^


rem br;


set "pafIf=<<pafToSymlink|pafToFolder>>"
set "gIfZsymLink="
for /f "tokens=*" %%q in ('dir "!pafIf!" /al /b') do (
    for /f "tokens=2 delims=[]" %%r in ('dir /al ^| findstr /i /c:"%%q"') do (
        set "gIfZsymLink=!gIfZsymLink!%%~fq>%%r!br!"
    )
)
set "gIfZsymLink=!gIfZsymLink:~0,-1!"
rem echo "!gIfZsymLink!"

for /f "tokens=1,2 delims=>" %%q in ("!gIfZsymLink!") do (
    echo symlink: %%q , filepath: %%r
)


:scIn
rem endlocal
pause
rem exit /b
0

If you really want to use fsutil, you can use both technics to prevent failure from errolevel. (I use ver >nul to reset errorlevel)

:function_is_symlink_file_folder item_to_test result
rem 0 = Error
rem 1 = Symlink
rem 2 = File
rem 3 = Folder

:function_is_symlink_file_folder
    setlocal enabledelayedexpansion
    set item_to_test=!%~1!
    set /a result=0
    for %%i in ("%item_to_test%") do set attributes=%%~ai
    set attribute_1=%attributes:~0,1%
    set attribute_9=%attributes:~8,1%
    ver >nul
    fsutil reparsepoint query "%item_to_test%" >nul
    if %errorlevel% == 1 (
        if "%attribute_1%" == "d" (
            set /a result=3
        ) else (
            set /a result=2
        )
    ) else (
        if "%attribute_9%" == "l" (
            set /a result=1
        ) else (
            if "%attribute_1%" == "d" (
                set /a result=3
            ) else (
                set /a result=2
            )
        )
    )
    endlocal & set /a %~2=%result%
goto :eof

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.