检查Windows 7中符号链接指向的位置


24

在Windows 7中,如何检查文件是否为符号链接,文件夹是否为结点,以及如何检查它们指向的位置(如果它们是符号链接/结点)。在资源管理器和命令行中。

拥有一种从命令行执行此操作的方法非常重要,以便在要制作文件夹树的精确副本时知道如何在另一台计算机上复制符号链接。

如果我右键单击文件并选中“属性”,则找不到任何表示它是符号链接的指示。

Answers:


26

dir命令 dir /a可以这样做:

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]

或者,您可以使用Windows资源管理器:

Right click column, More, Link Target

这在Windows 7(Microsoft Windows [Version 6.1.7601])中不起作用
gonzalezea

1
@gonzalezea是的,确实如此。我在2012年发布此文件时便已将其与Windows 7配合使用,现在也可以使用
Steven Penny

对于新用户来说,也许不是那么明显,但这是一个命令行解决方案。用户必须打开命令提示符,然后将目录(使用CD命令)更改为包含符号链接的目录,然后键入DIR命令并按“ enter”键。在错误的目录中运行DIR命令是常见的错误。但是可以理解,除非您确定符号链接位于哪个目录中(由于Windows GUI不会明确告诉您特定目录是否包含任何符号链接或结点,所以并不总是很明显)。查找具有FILE FOLDER类型而不是SHORTCUT类型的快捷方式
Ed999

2
Windows 7上的链接目标字段为空
Ronen Festinger

1
在命令行中,您应该输入dir /a然后按Enter。如果不包括/ a,则Windows不会列出连接点。您可以尝试dirdir /a目录上的区别\Users\YourUsername
Paulus

4

StackOverFlow复制,我只用了这一行,就可以了

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

说明

MSDN上获取有关FSUtil的信息:执行与文件分配表(FAT)和NTFS文件系统有关的任务,例如管理重解析点,管理稀疏文件或卸除卷。如果不带参数使用它,fsutil将显示支持的子命令列表。

对于我们的使用,我们只关心它输出其中包含“符号链接”的行,如果它是符号行,那么find,然后,如果find成功,则输出一件事,如果没有,则输出其他东西。

注意事项

  • 如果路径中包含空格,则必须在文件夹名称两边加上引号。
  • 无论该文件夹不存在还是不是符号链接,它都会提供相同的输出,请谨慎使用。

2

使用PowerShell,至少在Windows OS上,可以在任何给定目录中找到符号链接,例如:

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

更简洁的选择是使用Get-ChildItem的别名ls

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

通过执行以下任一操作,您可以在符号链接上获取相关信息:

获取文件项并输出其Target属性。目标是符号链接的“值”。另外,用于在操作系统之间并置时创建符号链接的方法或命令签名,“目标”,“路径”和/或“值”的参数名称可能具有与不同OS上的另一方法签名不同的含义。

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

获取文件项并输出其LinkType属性。LinkType值为SymbolicLink的项目意味着它是象征性的。

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

获取文件项并输出其Mode属性l模式值中带有的项目表示它是符号链接。

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

获取文件项并输出其Attributes属性。带有ReparsePoint值的项目可能表示符号链接。

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

1

请勿fsutil用于检查项目是否为符号链接。首先,由于errorlevel包含错误,因此有时它保持为0,并且实际文件夹被视为符号链接。错误级别不可信任。

出现问题find的原因find "Symbolic Link"是,英语可能会用,而其他语言则不会。

好的方法是从属性中搜索:

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!
)

%a附带的属性是“ drahscotlep”,“ l”是符号链接。


0

这是一个cygwin bash脚本,用于保存符号链接,将您喜欢的文件夹添加到第一行

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

在Powershell中:

dir | select Name, LinkType

2
尤其是因为这是一个已经有好的答案的老问题,所以解释您的答案所添加的内容以及命令的每个部分在做什么都是一种使之变得更好的简便方法。
music2myear18年

0

所有积分@SecurityAndPrivacyGuru,[cmd]

完整的批处理脚本/功能,可读取符号链接{| s在文件夹中}并输出列表以及它们及其目标路径

@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

如果您确实要使用fsutil,则可以使用两种技术来防止错误级别的失败。(我使用ver> nul重置错误级别)

: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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.