Sprawdzanie, gdzie wskazuje symboliczne łącze w Windows 7

24

W systemie Windows 7, w jaki sposób mogę sprawdzić, czy plik jest dowiązaniem symbolicznym, czy folder jest skrzyżowaniem, czy nie, i jak mogę sprawdzić, gdzie wskazują (w przypadku, gdy są dowiązaniem symbolicznym / łączem). Zarówno w Eksploratorze, jak i w wierszu poleceń.

Bardzo ważne jest, aby mieć sposób, aby to zrobić z wiersza polecenia, aby wiedzieć, jak powielać dowiązania symboliczne na innym komputerze, gdy chcesz utworzyć dokładną replikę drzewa folderów.

Po kliknięciu pliku prawym przyciskiem myszy i zaznaczeniu „Właściwości” nie mogę znaleźć żadnego wskazania, że ​​jest to link symboliczny.

BearCode
źródło

Odpowiedzi:

26

Polecenie dir dir /a może to zrobić:

2012-12-26  09:30 PM    <DIR>          .
2012-12-26  09:30 PM    <DIR>          ..
2012-12-26  09:30 PM                 0 a.txt
2012-12-26  09:30 PM    <SYMLINK>      link.txt [a.txt]

Alternatywnie możesz użyć Eksploratora Windows:

Right click column, More, Link Target
Steven Penny
źródło
To nie działa w systemie Windows 7 (Microsoft Windows [Wersja 6.1.7601])
gonzalezea
1
@ Gonzalezea tak, tak. Pracowałem z Windows 7 w 2012 roku, kiedy to opublikowałem, i teraz też działa
Steven Penny
Być może nie jest to tak oczywiste dla nowych użytkowników, jest to rozwiązanie z linii poleceń. Użytkownik musi otworzyć wiersz polecenia, a następnie zmienić katalog (za pomocą polecenia CD) na katalog zawierający dowiązanie symboliczne, a następnie wpisać polecenie DIR i nacisnąć klawisz „enter”. Uruchomienie polecenia DIR w niewłaściwym katalogu jest częstym błędem. Ale zrozumiałe, chyba że jesteś pewien, w którym katalogu znajduje się dowiązanie symboliczne (nie zawsze oczywiste, ponieważ GUI systemu Windows nie mówi wprost, czy dany katalog zawiera dowiązania symboliczne lub połączenia). Poszukaj skrótu typu FOLDER PLIKÓW zamiast SKRÓTU .
Ed999,
2
Pole docelowe linku jest puste w Windows 7
Ronen Festinger
1
z wiersza poleceń należy wpisać, dir /aa następnie nacisnąć Enter. Jeśli nie podasz / a, Windows nie wyświetli punktów połączenia. Możesz wypróbować różnicę między katalogiem dira dir /akatalogiem\Users\YourUsername
Paulus
4

Skopiowałem z StackOverFlow , właśnie użyłem tej linii i to działa

fsutil reparsepoint query "folder name" | find "Symbolic Link" >nul && echo symbolic link found || echo No symbolic link

Objaśnienie :

Z MSDN na temat FSUtil: Wykonuje zadania związane z tabelą alokacji plików (FAT) i systemami plików NTFS, takie jak zarządzanie punktami ponownej analizy, zarządzanie rzadkimi plikami lub odinstalowywanie woluminu. Jeśli jest używany bez parametrów, fsutil wyświetla listę obsługiwanych podkomend.

Na nasz użytek zależy nam tylko na tym, aby wypisał wiersz, który zawiera „Symbolic Link”, jeśli jest symboliczny, a następnie find , a jeśli nam się findpowiedzie, jedną rzecz, a jeśli nie, wyprowadzamy coś innego.

Notatki :

  • Cytaty wokół nazwy folderu są wymagane, jeśli ścieżka zawiera spacje.
  • Daje to samo wyjście, niezależnie od tego, czy folder nie istnieje, czy też nie jest dowiązaniem symbolicznym, należy zachować ostrożność.
Daniel K.
źródło
2

Korzystając z programu PowerShell, przynajmniej w systemie operacyjnym Windows można znaleźć dowiązania symboliczne w dowolnym danym katalogu, na przykład:

Get-ChildItem 'C:\nodejs\bin\' | Where-Object {$_.LinkType -eq 'SymbolicLink'}

Bardziej zwięzłą alternatywą byłoby użycie Get-ChildItemaliasu ls:

ls 'C:\nodejs' -Attributes ReparsePoint -Recurse

I możesz uzyskać odpowiednie informacje o dowiązaniu symbolicznym, wykonując jedną z następujących czynności:

Pobierz element pliku i wyślij jego właściwość Target . Cel jest „wartością” dowiązania symbolicznego. Dodatkowo, sygnatury metod lub poleceń do tworzenia dowiązań symbolicznych podczas zestawiania między systemami operacyjnymi, nazwy argumentów: „cel”, „ścieżka” i / lub „wartość” mogą mieć inne znaczenie niż inna sygnatura metody w innym systemie operacyjnym.

E:\AIT> Get-Item -Path 'C:\nodejs\bin\ionic.cmd' | Select-Object -ExpandProperty Target
E:\AIT\out\dependency_symlink.cmd

Pobierz element pliku i wyślij jego właściwość LinkType . Element o wartości LinkType SymbolicLink oznacza, że ​​jest to symboliczny symbol.

E:\AIT> Get-Item -Path 'C:\nodejs\bin\ionic.cmd' | Select-Object -ExpandProperty LinkType
SymbolicLink

Pobierz element pliku i wyślij jego właściwość Mode . Element z lwartością Mode wskazuje, że jest to dowiązanie symboliczne.

E:\AIT> Get-Item -Path 'C:\nodejs\bin\ionic.cmd' | Select-Object -ExpandProperty Mode
-a---l

Pobierz element pliku i wyślij jego właściwość Atrybuty . Element przypisany wartości ReparsePoint może wskazywać na dowiązanie symboliczne.

E:\AIT> Get-Item -Path 'C:\nodejs\bin\ionic.cmd' | Select-Object -ExpandProperty Attributes
Archive, ReparsePoint
Marckassay
źródło
1

Nie używaj fsutil do sprawdzania, czy element jest dowiązaniem symbolicznym, czy nie. Po pierwsze, ponieważ poziom błędu zawiera błędy, więc czasami pozostaje na poziomie 0, a prawdziwy folder jest wyświetlany jako łącze symboliczne. Poziom błędu nie można ufać.

Problem findpolega na tym, że find "Symbolic Link"jest to możliwe w języku angielskim, ale nie w innych językach.

Dobrym sposobem jest wyszukiwanie według atrybutów:

for %%i in ("%file_to_test%") do set attribute=%%~ai
set attribute=%attribute:~8,1%
if "%attribute%" == "l" (
    echo It's a symlink!
) else (
    echo Damned! It's real!
)

Atrybuty otrzymane z% a to „drahscotlep”, a „l” odnosi się do dowiązania symbolicznego.

Celes
źródło
0

Oto skrypt bg cygwin do zapisywania dowiązań symbolicznych, dodawania ulubionych folderów do pierwszego wiersza

find c:/ C:/Users/$USERNAME/SendTo C:/Users/$USERNAME/Desktop \
      -maxdepth 2 -type l \
      -printf 'mklink\t/D\t"%p"\t"%l"\n' | \
  perl -pne '\
      s!/cygdrive/(\w)/!\1:/!g;\
      s,/a/,/%USERNAME%/,g;\
      1;' | \
  sort -f | uniq  > restore-links.cmd
mosh
źródło
0

W PowerShell:

dir | select Name, LinkType
Jan
źródło
2
Zwłaszcza, że ​​jest to stare pytanie, które ma już dobre odpowiedzi, wyjaśniając, co dodaje twoja odpowiedź i co robi każda część polecenia, jest łatwym sposobem na ulepszenie.
music2myear
0

wszystkie kredyty na @SecurityAndPrivacyGuru , [cmd]

kompletny skrypt / funkcja wsadowa, która odczytuje symlink {| s w folderze} i wyświetla listę wraz z nimi oraz ich ścieżkami docelowymi

@echo off
setlocal enableExtensions enableDelayedExpansion
cd /D "%~dp0"
set br=^


rem br;


set "pafIf=<<pafToSymlink|pafToFolder>>"
set "gIfZsymLink="
for /f "tokens=*" %%q in ('dir "!pafIf!" /al /b') do (
    for /f "tokens=2 delims=[]" %%r in ('dir /al ^| findstr /i /c:"%%q"') do (
        set "gIfZsymLink=!gIfZsymLink!%%~fq>%%r!br!"
    )
)
set "gIfZsymLink=!gIfZsymLink:~0,-1!"
rem echo "!gIfZsymLink!"

for /f "tokens=1,2 delims=>" %%q in ("!gIfZsymLink!") do (
    echo symlink: %%q , filepath: %%r
)


:scIn
rem endlocal
pause
rem exit /b
Ilias
źródło
0

Jeśli naprawdę chcesz użyć fsutil, możesz użyć obu technik, aby zapobiec błędom z poziomu. (Używam ver> nul, aby zresetować poziom błędu)

:function_is_symlink_file_folder item_to_test result
rem 0 = Error
rem 1 = Symlink
rem 2 = File
rem 3 = Folder

:function_is_symlink_file_folder
    setlocal enabledelayedexpansion
    set item_to_test=!%~1!
    set /a result=0
    for %%i in ("%item_to_test%") do set attributes=%%~ai
    set attribute_1=%attributes:~0,1%
    set attribute_9=%attributes:~8,1%
    ver >nul
    fsutil reparsepoint query "%item_to_test%" >nul
    if %errorlevel% == 1 (
        if "%attribute_1%" == "d" (
            set /a result=3
        ) else (
            set /a result=2
        )
    ) else (
        if "%attribute_9%" == "l" (
            set /a result=1
        ) else (
            if "%attribute_1%" == "d" (
                set /a result=3
            ) else (
                set /a result=2
            )
        )
    )
    endlocal & set /a %~2=%result%
goto :eof
Celes
źródło