Windowsで壊れたシンボリックリンクを自動的に見つけるにはどうすればよいですか?


11

これが悪いスタイルかどうかはわかりませんが、他の場所で答えを見つけることができなかったので、ここでこの質問をしています。他の人の解決策に興味がありますが、数日後に自分の解決策を投稿します。

私の特定のケースでは、Windows 7で実行していますが、Windowsの他の/古いバージョンの回答に興味があります。1つの答えは「Unix findのバージョンをインストールしてから、Unixの場合と同様に解決する」ということですが、もっと「ネイティブ」なソリューションが必要でした。

編集2012-07-17:明確化:「自動的に」とは、ボタンを押すだけですべての作業を行うGUIツールではなく、スクリプトの一部として実行できるものを意味します。これは無人です。

回答:


4

多少遅れていますが、ここに私の質問に対する私自身の答えがあります。それは基本的にUnixでの通常のアプローチと同じアプローチです:すべてのリンクを見つけて、壊れたリンクに作用します。簡潔ではありません。以下のスクリプトは、壊れたシンボリックリンクについての情報をダンプした後、それらを削除します。

@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


2

SageLinksという名前のオープンソースユーティリティを試すこともできます。このユーティリティは、Windows NTFSジャンクション、シンボリックリンク、さらにはショートカットを表示およびチェックします。


0

cygwin64(find、xargs、sh、ls)の使用(win7で無効なntfsハードリンクをテスト)

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

注:test -eは、デッドntfsハードリンクでは期待どおりに機能しません。


1
@moshに感謝しますが、私が言ったように、「Unix utilsのバージョンをインストールする」ことを含まないものが欲しいです。なぜなら、他人が準備なしで実行できるスクリプトが欲しいからです。
HughG
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.