Как автоматически найти неработающие символические ссылки в Windows?


11

Не уверен, что это плохой стиль, но я задаю этот вопрос здесь, потому что я не мог найти ответ в другом месте, а затем я разработал одно решение самостоятельно. Мне было бы интересно увидеть решения других людей, но через несколько дней я опубликую свои собственные.

В моем конкретном случае я работаю на Windows 7, но меня будут интересовать ответы для других / более старых версий Windows. Я понимаю, что один из ответов - «установить версию Unix find, а затем решить, как для Unix », но я хотел более «нативное» решение.

РЕДАКТИРОВАТЬ 2012-07-17: Уточнение: под "автоматически" я в идеале имею в виду то, что я могу запустить как часть скрипта, а не как инструмент GUI, который выполняет всю работу при нажатии кнопки, потому что я хочу сделать это без присмотра.

Ответы:


4

несколько запоздалым, но вот мой собственный ответ на мой вопрос. По сути, это тот же подход, что и в Unix: найдите все ссылки, а затем действуйте по сломанным; это просто не так кратко. Приведенный ниже скрипт удаляет битые символические ссылки после вывода некоторой информации о них.

@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

Следующие инструменты могут помочь вам найти и удалить символическую ссылку в Windows

  1. Джанкшен Линк Мэджик
  2. Diskjunction

Оба они являются удобными инструментами графического интерфейса, но я не совсем понял: я хочу что-то, что я могу запустить в скрипте. Я отредактировал вопрос, чтобы уточнить.
HughG

2

Вы также можете попробовать утилиту с открытым исходным кодом SageLinks , которая показывает и проверяет соединения Windows NTFS, символические ссылки и даже ярлыки.


0

Использование cygwin64 (find, xargs, sh, ls) (протестировано на win7 для мертвых жестких ссылок ntfs)

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

Примечание: test -e не работает должным образом с мертвой жесткой ссылкой ntfs.


1
Спасибо @mosh, но, как я уже сказал, я хочу что-то, что не связано с «установкой версии утилит Unix» - потому что я хочу сценарий, который другие могут запускать без подготовки.
ХьюГГ
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.