ตรวจสอบจุดเชื่อมโยงสัญลักษณ์ที่อยู่ใน Windows 7


24

ใน Windows 7 ฉันจะตรวจสอบได้อย่างไรว่าไฟล์นั้นเป็นลิงก์สัญลักษณ์หรือไม่ถ้าโฟลเดอร์นั้นเป็นจุดเชื่อมต่อหรือไม่และฉันจะตรวจสอบตำแหน่งที่ไฟล์นั้นชี้ไปได้อย่างไร (ในกรณีที่เป็น symlink / ทางแยก) ทั้งใน Explorer และในบรรทัดคำสั่ง

สิ่งสำคัญคือต้องมีวิธีการทำจากบรรทัดคำสั่งเพื่อที่จะทราบวิธีการทำซ้ำลิงก์สัญลักษณ์บนคอมพิวเตอร์เครื่องอื่นเมื่อคุณต้องการสร้างแบบจำลองที่แน่นอนของแผนผังโฟลเดอร์

หากฉันคลิกขวาที่ไฟล์และตรวจสอบ "คุณสมบัติ" ฉันไม่พบสิ่งบ่งชี้ว่าเป็นลิงก์สัญลักษณ์

คำตอบ:


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 Explorer:

Right click column, More, Link Target

สิ่งนี้ไม่ทำงานใน windows 7 (Microsoft Windows [เวอร์ชั่น 6.1.7601])
gonzalezea

1
@gonzalezea ใช่แล้ว มันทำงานร่วมกับ Windows 7 ได้ในปี 2012 เมื่อฉันโพสต์สิ่งนี้และมันก็ใช้ได้เหมือนกัน
Steven Penny

อาจไม่ชัดเจนสำหรับผู้ใช้รายใหม่นี่เป็นโซลูชันบรรทัดคำสั่ง ผู้ใช้จะต้องเปิดพรอมต์คำสั่งจากนั้นเปลี่ยนไดเรกทอรี (โดยใช้คำสั่ง CD) เป็นไดเรกทอรีที่มีลิงก์สัญลักษณ์จากนั้นพิมพ์คำสั่ง DIR และกดปุ่ม 'Enter' การรันคำสั่ง DIR ในไดเรกทอรีที่ไม่ถูกต้องเป็นข้อผิดพลาดทั่วไป แต่เข้าใจได้เว้นแต่คุณจะแน่ใจว่ามี symlink อยู่ในไดเรกทอรีใด (ไม่ชัดเจนเสมอไปเนื่องจาก GUI ของ Windows ไม่ได้บอกคุณอย่างชัดเจนว่าไดเรกทอรีใดที่มี symlink หรือ junctions) มองหาทางลัดที่มีประเภทโฟลเดอร์แฟ้มแทนทางลัด
Ed999

2
ฟิลด์เป้าหมายลิงค์ว่างเปล่าบน windows 7
Ronen Festinger

1
จากบรรทัดคำสั่งที่คุณควรพิมพ์dir /aแล้วกด Enter หากคุณไม่รวม / a หน้าต่างจะไม่แสดงรายการจุดเชื่อมต่อ คุณสามารถลองใช้ความแตกต่างระหว่างdirและdir /aในไดเรกทอรี\Users\YourUsername
พอลลัส

4

คัดลอกมาจากStackOverFlowฉันเพิ่งใช้บรรทัดนี้และใช้งานได้

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

คำอธิบาย :

จากMSDNเกี่ยวกับ FSUtil: ทำงานที่เกี่ยวข้องกับระบบไฟล์การจัดสรรตาราง (FAT) และระบบไฟล์ NTFS เช่นการจัดการจุดแยกวิเคราะห์ใหม่การจัดการไฟล์กระจัดกระจายหรือการถอดไดรฟ์ หากใช้โดยไม่มีพารามิเตอร์ fsutil จะแสดงรายการคำสั่งย่อยที่สนับสนุน

สำหรับการใช้งานของเราเราแค่ใส่ใจว่ามันจะแสดงผลบรรทัดที่มี "Symbolic Link" อยู่ในนั้นถ้าเป็นสัญลักษณ์ซึ่งเรานั้นfindและหากfindประสบความสำเร็จเราจะส่งสิ่งหนึ่งออกมาถ้าไม่เป็นเช่นนั้น

หมายเหตุ :

  • ต้องการเครื่องหมายคำพูดล้อมรอบชื่อโฟลเดอร์หากเส้นทางมีช่องว่าง
  • มันให้ผลลัพธ์เดียวกันว่าโฟลเดอร์ไม่มีอยู่หรือไม่ใช่ symlink ใช้ด้วยความระมัดระวัง

2

การใช้ PowerShell บน Windows OS เป็นอย่างน้อยคุณสามารถค้นหาลิงก์สัญลักษณ์ในไดเรกทอรีใด ๆ ที่ระบุเช่น:

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

ทางเลือกที่สั้นกว่านั้นคือใช้Get-ChildItemนามแฝงของls:

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

และคุณสามารถรับข้อมูลที่เกี่ยวข้องในลิงก์สัญลักษณ์ได้โดยทำสิ่งใดสิ่งหนึ่งต่อไปนี้:

รับรายการไฟล์และเอาท์พุทคุณสมบัติเป้าหมาย เป้าหมายคือ "ค่า" ของ symbolic-link นอกจากนี้เมธอดหรือลายเซ็นคำสั่งสำหรับการสร้าง symlink เมื่อทำการผสมระหว่างระบบปฏิบัติการชื่ออาร์กิวเมนต์ของ: 'target', 'path' และ / หรือ 'value' อาจเก็บความหมายที่แตกต่างจากลายเซ็นเมธอดอื่นบนระบบปฏิบัติการอื่น

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

รับรายการไฟล์และเอาท์พุทคุณสมบัติโหมด รายการที่มีlในค่าโหมดระบุว่าเป็นลิงค์สัญลักษณ์

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

รับรายการของไฟล์และการส่งออกของคุณสมบัติคุณสมบัติ รายการประกอบกับค่า ReparsePoint อาจบ่งบอกถึงการเชื่อมโยงสัญลักษณ์

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

1

อย่าใช้fsutilเพื่อตรวจสอบว่ารายการนั้นเป็นลิงค์สัญลักษณ์หรือไม่ ในตอนแรกเนื่องจากข้อผิดพลาดระดับมีข้อผิดพลาดดังนั้นบางครั้งมันจะอยู่ที่ 0 และโฟลเดอร์จริงถูกมองว่าเป็นลิงก์สัญลักษณ์ Errorlevel ไม่สามารถเชื่อถือได้

ปัญหา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 เพื่อบันทึก symlink เพิ่มโฟลเดอร์โปรดของคุณไปที่บรรทัดแรก

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

ในพาวเวอร์เชล:

dir | select Name, LinkType

2
โดยเฉพาะอย่างยิ่งเพราะนี่เป็นคำถามเก่าที่มีคำตอบที่ดีอยู่แล้วการอธิบายว่าคำตอบของคุณเพิ่มอะไรและคำสั่งแต่ละส่วนนั้นทำอะไรเป็นวิธีที่ง่ายในการทำให้ดีขึ้น
music2myear

0

เครดิตทั้งหมดให้กับ@SecurityAndPrivacyGuru , [cmd]

ชุดสคริปต์ / ฟังก์ชั่นที่สมบูรณ์ซึ่งอ่าน symlink {| 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 จริงๆคุณสามารถใช้ทั้งสองเทคนิคเพื่อป้องกันความล้มเหลวจาก errolevel (ฉันใช้ ver> nul เพื่อรีเซ็ต 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.