Überprüfen, wo ein symbolischer Link in Windows 7 verweist

24

Wie kann ich in Windows 7 überprüfen, ob eine Datei eine symbolische Verknüpfung ist oder nicht, ob ein Ordner eine Verknüpfung ist oder nicht, und wie kann ich überprüfen, wohin sie zeigen (falls es sich um eine symbolische Verknüpfung / Verknüpfung handelt). Sowohl im Explorer als auch in der Befehlszeile.

Es ist sehr wichtig, eine Möglichkeit zu haben, dies über die Befehlszeile zu tun, um zu wissen, wie symbolische Links auf einem anderen Computer dupliziert werden, wenn Sie eine exakte Replik eines Ordnerbaums erstellen möchten.

Wenn ich mit der rechten Maustaste auf eine Datei klicke und "Eigenschaften" überprüfe, kann ich keinen Hinweis darauf finden, dass es sich um einen symbolischen Link handelt.

BearCode
quelle

Antworten:

26

Der Befehl dir dir /a kann dies tun:

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]

Alternativ können Sie Windows Explorer verwenden:

Right click column, More, Link Target
Steven Penny
quelle
Das funktioniert nicht in Windows 7 (Microsoft Windows [Version 6.1.7601])
gonzalezea
1
@gonzalezea ja, das tut es. Es funktionierte mit Windows 7 im Jahr 2012, als ich dies gepostet habe, und es funktioniert jetzt auch
Steven Penny
Für neue Benutzer vielleicht nicht so offensichtlich, ist dies eine Befehlszeilenlösung. Der Benutzer muss eine Eingabeaufforderung öffnen, dann das Verzeichnis (mithilfe des CD-Befehls) in ein Verzeichnis ändern, das eine symbolische Verknüpfung enthält, dann den Befehl DIR eingeben und die Eingabetaste drücken. Das Ausführen des Befehls DIR im falschen Verzeichnis ist ein häufiger Fehler. Aber verständlich, es sei denn, Sie sind sich sicher, in welchem ​​Verzeichnis sich ein Symlink befindet (nicht immer offensichtlich, da die Windows-Benutzeroberfläche nicht ausdrücklich angibt, ob ein bestimmtes Verzeichnis Symlinks oder Junctions enthält). Suchen Sie nach einer Verknüpfung mit dem Typ FILE FOLDER anstelle von SHORTCUT .
Ed999
2
Das Linkzielfeld ist unter Windows 7
Ronen Festinger
1
dir /aGeben Sie in der Befehlszeile Folgendes ein und drücken Sie die Eingabetaste. Wenn Sie das / a nicht einschließen, listet Windows keine Knotenpunkte auf. Sie können den Unterschied zwischen dirund dir /aauf Verzeichnis versuchen\Users\YourUsername
Paulus
4

Von StackOverFlow kopiert , habe ich gerade diese Zeile verwendet, und es funktioniert

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

Erklärung :

Von MSDN über FSUtil: Führt Aufgaben aus, die sich auf FAT- (File Allocation Table) und NTFS-Dateisysteme beziehen, z. B. das Verwalten von Analysepunkten, das Verwalten von Dateien mit geringer Dichte oder das Aufheben der Bereitstellung eines Volumes. Wenn es ohne Parameter verwendet wird, zeigt fsutil eine Liste der unterstützten Unterbefehle an.

Für unsere Anwendung, wir kümmern uns nur , dass es eine Linie gibt , die „symbolische Verknüpfung“ in ihm, wenn es symbolisch ist, die wir dann find, und wenn finderfolgreich ist , geben wir eine Sache, wenn dies nicht der Fall, geben wir etwas anderes.

Anmerkungen :

  • Die Anführungszeichen um den Ordnernamen sind erforderlich, wenn der Pfad Leerzeichen enthält.
  • Es gibt die gleiche Ausgabe aus, wenn der Ordner nicht existiert oder kein Symlink ist.
Daniel K.
quelle
2

Mit PowerShell können Sie unter mindestens Windows-Betriebssystemen symbolische Links in einem bestimmten Verzeichnis finden, z.

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

Eine prägnantere Alternative wäre die Verwendung Get-ChildItemdes Alias ls:

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

Und Sie können relevante Informationen zu einem symbolischen Link erhalten, indem Sie einen der folgenden Schritte ausführen:

Ruft das Dateielement ab und gibt dessen Target-Eigenschaft aus . Ziel ist der "Wert" des symbolischen Links. Zusätzlich können Methoden- oder Befehlssignaturen zum Erstellen von Symlinks beim Nebeneinanderstellen von Betriebssystemen die Argumentnamen 'Ziel', 'Pfad' und / oder 'Wert' eine andere Bedeutung haben als eine andere Methodensignatur auf einem anderen Betriebssystem.

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

Ruft das Dateielement ab und gibt dessen LinkType-Eigenschaft aus . Ein Element mit einem LinkType-Wert von SymbolicLink bedeutet, dass es symbolisch ist.

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

Ruft das Dateielement ab und gibt dessen Mode-Eigenschaft aus . Ein Element mit ldem Wert Mode zeigt an, dass es sich um eine symbolische Verknüpfung handelt.

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

Rufen Sie das Dateielement ab und geben Sie die Eigenschaft Attributes aus . Ein Element zugeschrieben mit einem ReparsePoint Wert vielleicht bezeichnend auf einen symbolischen-Link.

E:\AIT> Get-Item -Path 'C:\nodejs\bin\ionic.cmd' | Select-Object -ExpandProperty Attributes
Archive, ReparsePoint
marckassay
quelle
1

Verwenden Sie fsutildiese Option nicht, um zu überprüfen, ob ein Element ein symbolischer Link ist oder nicht. Zuerst, weil errorlevel Fehler enthält, bleibt es manchmal auf 0 und ein realer Ordner wird als symbolischer Link angesehen. Errorlevel ist nicht vertrauenswürdig.

Ein Problem mit findist, weil find "Symbolic Link"es in Englisch möglich ist, aber nicht in anderen Sprachen.

Der gute Weg ist, anhand der Attribute zu suchen:

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!
)

Attribute, die mit% a erhalten wurden, sind "drahscotlep" und "l" steht für eine symbolische Verknüpfung.

Celes
quelle
0

Hier ist ein Cygwin-Bash-Skript zum Speichern von Symlinks und zum Hinzufügen Ihrer Lieblingsordner zur ersten Zeile

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
quelle
0

In Powershell:

dir | select Name, LinkType
John
quelle
2
Vor allem, weil dies eine alte Frage ist, die bereits gute Antworten enthält. Wenn Sie erklären, was Ihre Antwort hinzufügt und was die einzelnen Teile des Befehls bewirken, können Sie dies auf einfache Weise verbessern.
music2myear
0

alle Kredite an @SecurityAndPrivacyGuru , [cmd]

Komplettes Batch-Skript / Funktion, die symlink {| s in folder} liest und eine Liste mit ihnen und ihren Zielpfaden ausgibt

@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
quelle
0

Wenn Sie fsutil wirklich verwenden möchten, können Sie beide Techniken verwenden, um einen Fehler auf Errolevel zu verhindern. (Ich benutze ver> nul, um den Fehlerlevel zurückzusetzen.)

: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
quelle