Jak automatycznie znaleźć zepsute dowiązania symboliczne w systemie Windows?


11

Nie jestem pewien, czy to zły styl, ale zadaję to pytanie, ponieważ nie mogłem znaleźć odpowiedzi gdzie indziej, a potem sam opracowałem jedno rozwiązanie. Chciałbym zobaczyć rozwiązania innych ludzi, ale po kilku dniach opublikuję własne.

W moim konkretnym przypadku korzystam z systemu Windows 7, ale byłbym zainteresowany odpowiedziami na inne / starsze wersje systemu Windows. Zdaję sobie sprawę, że jedną z odpowiedzi jest „zainstaluj wersję znalezionego Unixa, a następnie rozwiązuj jak dla Unixa ”, ale chciałem bardziej „natywnego” rozwiązania.

EDYCJA 2012-07-17: Wyjaśnienie: „automatycznie” Mam na myśli coś, co mogę uruchomić jako część skryptu, a nie narzędzie GUI, które wykonuje całą pracę za naciśnięciem przycisku, ponieważ chcę to zrobić to bez opieki.

Odpowiedzi:


4

nieco spóźnione, ale oto moja własna odpowiedź na moje pytanie. Jest to w zasadzie takie samo podejście jak w Unixie: znajdź wszystkie linki, a następnie działaj na zepsute; to po prostu nie jest tak zwięzłe. Poniższy skrypt usuwa uszkodzone dowiązania symboliczne po usunięciu niektórych informacji na ich temat.

@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

Następujące narzędzia mogą pomóc w znalezieniu i usunięciu dowiązania symbolicznego w systemie Windows

  1. Junction Link Magic
  2. Złącze dyskowe

Oba są przydatnymi narzędziami GUI, ale nie było jasne: chcę coś, co mogę uruchomić w skrypcie. Zredagowałem pytanie, aby wyjaśnić.
HughG,

2

Możesz także wypróbować narzędzie open source o nazwie SageLinks , które pokazuje i sprawdza połączenia Windows NTFS, dowiązania symboliczne, a nawet skróty.


0

Korzystanie z cygwin64 (find, xargs, sh, ls) (przetestowane na Win7 pod kątem hardlinks martwych NTFS)

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

Uwaga: test -e nie działa zgodnie z oczekiwaniami z martwym dowiązaniem NTFS.


1
Dzięki @mosh, ale, jak powiedziałem, chcę czegoś, co nie wymaga „instalacji wersji narzędzi Uniksa” - ponieważ chcę skryptu, który inni mogą uruchomić bez przygotowania.
HughG
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.