Windows'ta bozuk simgeleri otomatik olarak nasıl bulabilirim?


11

Bunun kötü bir stil olup olmadığından emin değilim, ama burada bu soruyu soruyorum çünkü cevabı başka bir yerde bulamadım ve sonra kendi başıma bir çözüm buldum. Diğer insanların çözümlerini görmek isterim, ancak birkaç gün sonra kendimi göndereceğim.

Benim özel durumumda, Windows 7 üzerinde çalışıyorum, ancak Windows'un diğer / eski sürümlerinin cevaplarıyla ilgileniyorum. Bir cevabın "Unix find'ın bir versiyonunu yükleyin ve Unix için olduğu gibi çöz " olduğunu anlıyorum, ama daha "doğal" bir çözüm istedim.

EDIT 2012-07-17: Açıklama: "otomatik olarak" ideal olarak bir düğmeye basarak tüm işi yapan bir GUI aracı yerine, bir komut dosyası parçası olarak çalıştırabileceğim bir şey demek, çünkü yapmak isteyeceğim bu katılımsız.

Yanıtlar:


4

biraz gecikmiş, ama soruma kendi cevabım burada. Temelde Unix'teki olağan yaklaşımla aynı yaklaşımdır: tüm bağlantıları bulun, sonra kırık olanlara göre hareket edin; sadece özlü değil. Aşağıdaki senaryo, onlar hakkında bazı bilgiler çıkardıktan sonra bozuk sembolik bağlantıları siler.

@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

3

Aşağıdaki araçlar Windows'ta symlink'i bulmanıza ve kaldırmanıza yardımcı olabilir

  1. Bağlantı Bağlantı Büyüsü
  2. Diskjunction

Her ikisi de kullanışlı GUI araçları, ama net değilim: Bir senaryoda çalıştırabileceğim bir şey istiyorum. Soruyu açıklığa kavuşturmak için düzenledim.
HughG

2

SageLinks adlı açık kaynaklı bir yardımcı programı da deneyebilirsiniz , Windows NTFS bağlantılarını, sembolik bağlantıları ve hatta kısayolları gösterir ve kontrol eder.


0

Cygwin64 kullanma (find, xargs, sh, ls) (win7 üzerinde ölü ntfs hardlinkleri için test edilmiştir)

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

Not: test -e, ölü ntfs sabit bağlantısında beklendiği gibi çalışmaz.


1
Teşekkürler @mosh ama, dediğim gibi, "Unix araçlarının bir sürümünü yükle" içermeyen bir şey istiyorum - çünkü başkalarının hazırlıksız çalıştırabileceği bir komut dosyası istiyorum.
HughG
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.