Bagaimana cara menemukan symlink yang rusak secara otomatis di Windows?

11

Tidak yakin apakah ini gaya yang buruk, tetapi saya mengajukan pertanyaan ini di sini karena saya tidak dapat menemukan jawabannya di tempat lain, dan kemudian saya menemukan satu solusi sendiri. Saya tertarik untuk melihat solusi orang lain, tetapi setelah beberapa hari saya akan memposting solusi saya sendiri.

Dalam kasus khusus saya, saya menjalankan Windows 7, tetapi saya akan tertarik pada jawaban untuk Windows versi lain / lama. Saya menyadari bahwa satu jawaban adalah "instal versi Unix find, dan kemudian selesaikan untuk Unix ", tetapi saya menginginkan solusi yang lebih "asli".

EDIT 2012-07-17: Klarifikasi: oleh "secara otomatis" Saya idealnya berarti sesuatu yang dapat saya jalankan sebagai bagian dari skrip, daripada alat GUI yang melakukan semua pekerjaan dengan menekan tombol, karena saya ingin melakukan ini tanpa pengawasan.

HughG
sumber

Jawaban:

4

agak terlambat, tapi inilah jawaban saya sendiri untuk pertanyaan saya. Ini pada dasarnya pendekatan yang sama dengan yang biasa di Unix: temukan semua tautan, lalu lakukan yang rusak; hanya saja tidak sesingkat itu. Script di bawah ini menghapus symlink yang rusak, setelah membuang beberapa informasi tentang mereka.

@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
HughG
sumber
3

Alat-alat berikut dapat membantu Anda dalam menemukan dan menghapus symlink di Windows

  1. Junction Link Magic
  2. Diskjunction
Abhijeet Kasurde
sumber
Keduanya adalah alat GUI yang berguna, tetapi saya tidak jelas: Saya ingin sesuatu yang dapat saya jalankan dalam skrip. Saya telah mengedit pertanyaan untuk diklarifikasi.
HughG
2

Anda juga dapat mencoba utilitas open-source bernama SageLinks , ia memperlihatkan dan memeriksa persimpangan Windows NTFS, tautan simbolik dan bahkan pintasan.

Nikolay Raspopov
sumber
0

Menggunakan cygwin64 (find, xargs, sh, ls) (diuji pada win7 untuk tautan mati ntfs mati)

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

Catatan: test -e tidak berfungsi seperti yang diharapkan dengan tautan mati ntfs

mosh
sumber
1
Terima kasih @ mas tapi, seperti yang saya katakan, saya menginginkan sesuatu yang tidak melibatkan "instal versi Unix utils" - karena saya ingin skrip yang dapat dijalankan orang lain tanpa persiapan.
HughG