Làm cách nào để tìm các symlink bị hỏng tự động trên Windows?


11

Không chắc đây có phải là phong cách xấu không, nhưng tôi đang hỏi câu hỏi này ở đây vì tôi không thể tìm thấy câu trả lời ở nơi khác, và sau đó tôi đã tự mình tìm ra một giải pháp. Tôi rất muốn xem giải pháp của người khác, nhưng sau vài ngày tôi sẽ đăng bài của riêng mình.

Trong trường hợp cụ thể của tôi, tôi đang chạy trên Windows 7, nhưng tôi quan tâm đến câu trả lời cho các phiên bản Windows cũ / khác. Tôi nhận ra rằng một câu trả lời là "cài đặt phiên bản Unix find, sau đó giải quyết như cho Unix ", nhưng tôi muốn một giải pháp "bản địa" hơn.

EDIT 2012/07/17: Làm rõ: bằng cách "tự động" Tôi có nghĩa là một cái gì đó tôi có thể chạy như một phần của tập lệnh, chứ không phải là một công cụ GUI làm tất cả công việc chỉ bằng cách nhấn nút, bởi vì tôi sẽ muốn làm điều này không giám sát.

Câu trả lời:


4

hơi muộn màng, nhưng đây là câu trả lời của riêng tôi cho câu hỏi của tôi. Về cơ bản, đây là cách tiếp cận tương tự như cách thông thường trên Unix: tìm tất cả các liên kết, sau đó hành động trên các liên kết bị hỏng; nó chỉ không súc tích. Kịch bản dưới đây sẽ xóa các liên kết tượng trưng bị hỏng, sau khi bỏ đi một số thông tin về chúng.

@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

Các công cụ sau có thể giúp bạn trong việc tìm và xóa symlink trong Windows

  1. Ma thuật liên kết
  2. Ổ đĩa

Cả hai đều là các công cụ GUI tiện dụng, nhưng tôi không rõ: Tôi muốn một cái gì đó tôi có thể chạy trong một tập lệnh. Tôi đã chỉnh sửa câu hỏi để làm rõ.
HughG

2

Bạn cũng có thể thử một tiện ích nguồn mở có tên SageLinks , nó hiển thị và kiểm tra các mối nối NTFS của Windows, các liên kết tượng trưng và thậm chí các phím tắt.


0

Sử dụng cygwin64 (find, xargs, sh, ls) (đã thử nghiệm trên win7 cho các liên kết cứng ntfs đã chết)

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

Lưu ý: test -e không hoạt động như mong đợi với liên kết cứng ntfs đã chết.


1
Cảm ơn @mosh nhưng, như tôi đã nói, tôi muốn một cái gì đó không liên quan đến "cài đặt phiên bản của các tiện ích Unix" - bởi vì tôi muốn một tập lệnh mà người khác có thể chạy mà không cần chuẩn bị.
HughG
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.