Comment trouver automatiquement les liens symboliques rompus sous Windows?

11

Je ne sais pas si c'est un mauvais style, mais je pose cette question ici parce que je n'ai pas trouvé la réponse ailleurs, puis j'ai trouvé une solution par moi-même. Je serais intéressé de voir les solutions d'autres personnes, mais après quelques jours, je posterai la mienne.

Dans mon cas spécifique, j'exécute sur Windows 7, mais je serais intéressé par les réponses pour les autres / anciennes versions de Windows. Je me rends compte qu'une réponse est "installer une version de Unix find, puis résoudre comme pour Unix ", mais je voulais une solution plus "native".

EDIT 2012-07-17: Clarification: par "automatiquement", j'entends idéalement quelque chose que je peux exécuter dans le cadre d'un script, plutôt qu'un outil GUI qui fait tout le travail en appuyant sur un bouton, parce que je veux faire cela sans surveillance.

HughG
la source

Réponses:

4

un peu tard, mais voici ma propre réponse à ma question. C'est fondamentalement la même approche que celle habituelle sur Unix: trouver tous les liens, puis agir sur ceux qui sont brisés; ce n'est pas aussi concis. Le script ci-dessous supprime les liens symboliques rompus, après avoir vidé certaines informations les concernant.

@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
la source
3

Les outils suivants peuvent vous aider à trouver et à supprimer le lien symbolique dans Windows

  1. Junction Link Magic
  2. Diskjunction
Abhijeet Kasurde
la source
Ce sont deux outils GUI pratiques, mais je n'étais pas clair: je veux quelque chose que je peux exécuter dans un script. J'ai édité la question pour clarifier.
HughG
2

Vous pouvez également essayer un utilitaire open-source nommé SageLinks , il affiche et vérifie les jonctions Windows NTFS, les liens symboliques et même les raccourcis.

Nikolay Raspopov
la source
0

Utilisation de cygwin64 (find, xargs, sh, ls) (testé sur win7 pour les liens durs ntfs morts)

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

Remarque: test -e ne fonctionne pas comme prévu avec un lien dur ntfs mort.

mosh
la source
1
Merci @mosh mais, comme je l'ai dit, je veux quelque chose qui n'implique pas "installer une version des utilitaires Unix" - parce que je veux un script que d'autres peuvent exécuter sans préparation.
HughG