Як знайти автоматичні посилання на Windows автоматично?


11

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

У моєму конкретному випадку я працюю в Windows 7, але мені будуть цікаві відповіді на інші / старіші версії Windows. Я розумію, що одна відповідь - "встановити версію Unix find, а потім вирішити як для Unix ", але я хотів більш "рідного" рішення.

EDIT 2012-07-17: Пояснення: "автоматично" я в ідеалі маю на увазі те, що я можу запустити як частину сценарію, а не інструмент графічного інтерфейсу, який виконує всю роботу одним натисненням кнопки, тому що я хочу це зробити це без нагляду.

Відповіді:


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. Дис'юнкція

Це обидва зручні інструменти графічного інтерфейсу, але мені було не зрозуміло: я хочу щось, що можу запустити в сценарії. Я відредагував питання, щоб уточнити.
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 %" 

Примітка: тест -e не працює, як очікувалося, із мертвим посиланням ntfs.


1
Дякую @mosh, але, як я вже сказав, я хочу щось, що не передбачає "встановити версію утилітів Unix" - тому що я хочу сценарій, який інші можуть запускати без підготовки.
HughG
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.