Checking where a symbolic link points at in Windows 7
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.
Solution 1:
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
Solution 2:
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.
Solution 3:
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
Solution 4:
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.