Wie finde ich defekte Symlinks unter Windows automatisch?

11

Ich bin mir nicht sicher, ob dies ein schlechter Stil ist, aber ich stelle diese Frage hier, weil ich die Antwort anderswo nicht finden konnte, und habe dann selbst eine Lösung ausgearbeitet. Ich würde gerne die Lösungen anderer Leute sehen, aber nach ein paar Tagen werde ich meine eigenen veröffentlichen.

In meinem speziellen Fall läuft Windows 7, aber ich würde mich für Antworten für andere / ältere Windows-Versionen interessieren. Mir ist klar, dass eine Antwort lautet: "Installieren Sie eine Version von Unix find und lösen Sie dann wie bei Unix ", aber ich wollte eine "native" Lösung.

EDIT 2012-07-17: Klarstellung: Mit "automatisch" meine ich im Idealfall etwas, das ich als Teil eines Skripts ausführen kann, anstatt eines GUI-Tools, das die ganze Arbeit auf Knopfdruck erledigt, weil ich es tun möchte dies unbeaufsichtigt.

HughG
quelle

Antworten:

4

etwas verspätet, aber hier ist meine eigene Antwort auf meine Frage. Es ist im Grunde der gleiche Ansatz wie unter Unix üblich: Finde alle Links und handle dann nach den kaputten. es ist einfach nicht so prägnant. Das folgende Skript löscht fehlerhafte Symlinks, nachdem einige Informationen über sie ausgegeben wurden.

@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
HughG
quelle
3

Die folgenden Tools können Ihnen beim Suchen und Entfernen von Symlink in Windows helfen

  1. Junction Link Magic
  2. Diskjunction
Abhijeet Kasurde
quelle
Das sind beide praktische GUI-Tools, aber mir war nicht klar: Ich möchte etwas, das ich in einem Skript ausführen kann. Ich habe die Frage bearbeitet, um sie zu klären.
HughG
2

Sie können auch ein Open-Source-Dienstprogramm namens SageLinks ausprobieren , das Windows NTFS-Junctions, symbolische Links und sogar Verknüpfungen anzeigt und überprüft.

Nikolay Raspopov
quelle
0

Verwenden von cygwin64 (find, xargs, sh, ls) (getestet auf win7 für tote ntfs-Hardlinks)

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

Hinweis: test -e funktioniert nicht wie erwartet mit totem ntfs-Hardlink.

mosh
quelle
1
Danke @mosh, aber wie gesagt, ich möchte etwas, das nicht "eine Version von Unix-Utils installieren" beinhaltet - weil ich ein Skript möchte, das andere ohne Vorbereitung ausführen können.
HughG