Jak automatycznie znaleźć uszkodzone łącza symboliczne w systemie Windows?


Nie jestem pewien, czy to zły styl, ale zadaję tutaj to pytanie, ponieważ nie mogłem znaleźć odpowiedzi gdzie indziej, a potem sam wypracowałem jedno rozwiązanie. Chciałbym zobaczyć rozwiązania innych osób, ale swoje opublikuję za kilka dni.
W moim przypadku pracuję na Windows 7, ale byłbym zainteresowany odpowiedziami dla innych/starszych wersji Windowsa. Rozumiem, że jedna odpowiedź brzmi: „zainstaluj wersję systemu Unix, znajdź i wtedy

rozwiązać jak dla Uniksa
https://serverfault.com/questi ... cally
”, ale chciałem bardziej„ natywnego ”rozwiązania.

EDYCJA 2012-07-17:

Wyjaśnienie: Przez „automatycznie” najlepiej rozumiem coś, co mogę uruchomić jako część skryptu, a nie jako narzędzie GUI, które wykonuje całą pracę za jednym kliknięciem przycisku, ponieważ chcę to zrobić bez nadzoru.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

nieco spóźniona, ale oto moja odpowiedź na moje pytanie. Zasadniczo jest to to samo podejście, co zwykłe podejście Uniksa: znajdź wszystkie łącza, a następnie zajmij się zepsutymi; po prostu nie jest to takie zwięzłe. Poniższy skrypt usuwa zepsute dowiązania symboliczne po zrzuceniu niektórych informacji o nich.
@echo offrem 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 %~dp0set 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
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Poniższe narzędzia mogą pomóc znaleźć i usunąć dowiązanie symboliczne w systemie Windows.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz także wypróbować narzędzie open source o nazwie

SageLinks
https://github.com/raspopov/SageLinks/releases, pokazuje i sprawdza połączenia Windows NTFS, dowiązania symboliczne, a nawet skróty.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Używanie cygwin64 (find, xargs, sh, ls) (testowane na win7 pod kątem martwych linków twardych 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.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się