Question Comment trouver automatiquement des liens symboliques rompus sous Windows?


Je ne suis pas sûr que ce soit un mauvais style, mais je pose cette question ici parce que je ne trouvais pas de réponse ailleurs, puis j'ai mis au point une solution par moi-même. Je serais intéressé de voir les solutions des autres, mais après quelques jours, je posterai les miennes.

Dans mon cas spécifique, je tourne sous Windows 7, mais je souhaiterais obtenir des réponses pour d’autres / anciennes versions de Windows. Je me rends compte qu’une des réponses 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 que d'un outil graphique qui effectue tout le travail en appuyant sur un bouton, car je souhaite le faire sans surveillance.


11
2017-07-16 15:58


origine




Réponses:


quelque peu tardif, mais voici ma propre réponse à ma question. C'est fondamentalement la même approche que celle habituelle sous 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 la suppression de 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

4
2017-09-17 08:58





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

  1. Lien de jonction magique 
  2. Diskjunction

3
2017-07-16 17:09



Ce sont deux outils graphiques très utiles, mais je n’étais pas clair: je veux quelque chose que je puisse exécuter dans un script. J'ai édité la question pour clarifier. - HughG


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


2
2017-09-26 08:07