ฉันจะค้นหา symlink ที่ใช้งานไม่ได้โดยอัตโนมัติบน Windows ได้อย่างไร


11

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

ในกรณีเฉพาะของฉันฉันใช้ Windows 7 แต่ฉันสนใจคำตอบสำหรับ Windows รุ่นอื่น / เก่ากว่า ฉันรู้ว่าคำตอบเดียวคือ "ติดตั้ง Unix รุ่นหนึ่งแล้วหาคำตอบสำหรับ Unix " แต่ฉันต้องการโซลูชัน "ดั้งเดิม" มากกว่านี้

แก้ไข 2012-07-17: การชี้แจง: โดย "อัตโนมัติ" ฉันหมายถึงบางสิ่งบางอย่างที่ฉันสามารถเรียกใช้เป็นส่วนหนึ่งของสคริปต์ได้มากกว่าเครื่องมือ GUI ซึ่งทำงานทั้งหมดโดยการกดปุ่มเพียงปุ่มเดียวเพราะฉันต้องการจะทำ นี้แบบอัตโนมัติ

คำตอบ:


4

ล่าช้าบ้าง แต่ต่อไปนี้เป็นคำตอบสำหรับคำถามของฉัน มันเป็นวิธีการเดียวกับที่ใช้บน Unix: ค้นหาลิงก์ทั้งหมดจากนั้นทำตามวิธีที่ใช้ไม่ได้ มันไม่กระชับ สคริปต์ด้านล่างจะลบ symlink ที่เสียหายหลังจากที่ทิ้งข้อมูลบางอย่างเกี่ยวกับพวกเขา

@echo off

rem Grab the list of directories to scan, before we "pushd to dir containing this script",
rem so that we can have the default be "dir from which we ran this script".
setlocal
if x%CD%==x (echo Command Extensions must be enabled. && goto :eof)
set ORIGINAL_DIR=%CD%

pushd %~dp0

set DIRS_TO_CHECK=%*
if x%DIRS_TO_CHECK%==x (
    set DIRS_TO_CHECK=.
)

rem Find all the files which are both links (/al) and directories (/ad).
rem (We use "delims=" in case any paths have a space; space is a delim by default.)
rem If not, delete it (and assume something else will fix it later :-).
echo Deleting broken symlinks ...
echo.
for %%D in (%ORIGINAL_DIR%\%DIRS_TO_CHECK%) do (
    echo Checking %%D
    echo.
    pushd %%D
    if errorlevel 1 (
        echo Cannot find "%%D"
        echo.
        goto :Next_Dir
    )
    rem Clean up broken directory links.
    for /f "usebackq delims=" %%L in (`dir /adl /b`) do (
        rem Check the directory link works.
        rem Redirecting to nul just to hide "The system cannot find the file specified." message.
        pushd "%%L" >nul 2>&1
        if errorlevel 1 (
            echo Deleting broken directory symlink "%%L".
            rem First dump out some info on the link, before we delete it.
            rem I'd rather a more human-readable form, but don't know how to get that.
            fsutil reparsepoint query "%%L"
            rmdir "%%L"
            echo.
        ) else (
            popd
        )
    )
    rem Clean up broken file (non-directory) links.
    for /f "usebackq delims=" %%L in (`dir /a-dl /b`) do (
        rem Check the file link works.
        rem Redirecting to nul just to hide "The system cannot find the file specified." message.
        copy "%%L" nul >nul 2>&1
        if errorlevel 1 (
            echo Deleting broken file symlink "%%L".
            rem First dump out some info on the link, before we delete it.
            rem I'd rather a more human-readable form, but don't know how to get that.
            fsutil reparsepoint query "%%L"
            rm "%%L"
            echo.
        ) else (
            popd
        )
    )
    popd
    :Next_Dir
    rem Putting a label on the line immediately before a ')' causes a batch file parse error, hence this comment.
)
echo Deleting broken symlinks ... done.

:Finally
popd

3

เครื่องมือต่อไปนี้อาจช่วยคุณในการค้นหาและลบ symlink ใน Windows

  1. Junction Link Magic
  2. Diskjunction

ทั้งสองเป็นเครื่องมือ GUI ที่มีประโยชน์ แต่ฉันไม่ชัดเจน: ฉันต้องการสิ่งที่ฉันสามารถเรียกใช้ในสคริปต์ ฉันได้แก้ไขคำถามเพื่อชี้แจง
HughG

2

นอกจากนี้คุณยังสามารถลองใช้ยูทิลิตีโอเพนซอร์ซที่ชื่อSageLinksซึ่งจะแสดงและตรวจสอบจุดเชื่อมต่อ Windows NTFS ลิงค์สัญลักษณ์และแม้แต่ทางลัด


0

ใช้ cygwin64 (ค้นหา, xargs, sh, ls) (ทดสอบบน win7 สำหรับการเชื่อมโยงฮาร์ดคอร์ ntfs ที่ตายแล้ว)

c:\>   find ./ -type l |  xargs -I % sh -c "ls % > /dev/null 2>&1 || echo %" 

หมายเหตุ: ทดสอบ -e ใช้งานไม่ได้ตามที่คาดไว้กับฮาร์ดลิงก์ตายของ ntfs


1
ขอบคุณ @mosh แต่อย่างที่ฉันบอกฉันต้องการสิ่งที่ไม่เกี่ยวข้องกับ "ติดตั้ง Unix utils" - เพราะฉันต้องการสคริปต์ที่คนอื่นสามารถทำงานได้โดยไม่ต้องเตรียม
HughG
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.