Vérification de l'emplacement d'un lien symbolique dans Windows 7


24

Dans Windows 7, comment puis-je vérifier si un fichier est un lien symbolique ou non, si un dossier est une jonction ou non, et comment puis-je vérifier où ils pointent (au cas où ils seraient un lien symbolique / une jonction). À la fois dans l'Explorateur et dans la ligne de commande.

Il est très important d'avoir un moyen de le faire à partir de la ligne de commande, afin de savoir comment dupliquer des liens symboliques sur un autre ordinateur lorsque vous souhaitez créer une réplique exacte d'une arborescence de dossiers.

Si je clique avec le bouton droit sur un fichier et cochez "Propriétés", je ne trouve aucune indication qu'il s'agit d'un lien symbolique.

Réponses:


26

La commande dir dir /a peut faire ceci:

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]

Vous pouvez également utiliser l'Explorateur Windows:

Right click column, More, Link Target

Cela ne fonctionne pas dans Windows 7 (Microsoft Windows [Version 6.1.7601])
gonzalezea

1
@gonzalezea oui, c'est le cas. Cela a fonctionné avec Windows 7 en 2012 lorsque j'ai posté cela, et cela fonctionne maintenant aussi
Steven Penny

Peut-être pas si évident pour les nouveaux utilisateurs, c'est une solution en ligne de commande. L'utilisateur doit ouvrir une invite de commande, puis changer de répertoire (à l'aide de la commande CD) en un répertoire contenant un lien symbolique, puis taper la commande DIR et appuyer sur la touche «Entrée». L'exécution de la commande DIR dans le mauvais répertoire est une erreur courante. Mais compréhensible, sauf si vous êtes sûr du répertoire dans lequel se trouve un lien symbolique (pas toujours évident, car l'interface graphique de Windows ne vous dit pas explicitement si un répertoire particulier contient des liens symboliques ou des jonctions). Recherchez un raccourci de type FILE FOLDER au lieu de SHORTCUT .
Ed999

2
Le champ cible du lien est vide sur Windows 7
Ronen Festinger

1
à partir de la ligne de commande, vous devez taper dir /apuis appuyer sur Entrée. Si vous n'incluez pas le / a, Windows ne répertorie pas les points de jonction. Vous pouvez essayer la différence entre diret dir /asur le répertoire\Users\YourUsername
Paulus

4

Copié à partir de StackOverFlow , je viens d'utiliser cette ligne, et cela fonctionne

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

Explication :

À partir de MSDN sur FSUtil: effectue des tâches liées aux systèmes de fichiers FAT (File Allocation Table) et NTFS, telles que la gestion des points d'analyse, la gestion des fichiers épars ou le démontage d'un volume. S'il est utilisé sans paramètres, fsutil affiche une liste des sous-commandes prises en charge.

Pour notre usage, nous nous soucions juste qu'il génère une ligne qui a "Lien symbolique" en elle, si elle est symbolique, que nous puis find, et si findréussit, nous sortons une chose, si ce n'est pas le cas, nous sortons autre chose.

Remarques :

  • Les guillemets autour du nom du dossier sont obligatoires si le chemin contient des espaces.
  • Il donne la même sortie, que le dossier n'existe pas ou qu'il ne soit pas un lien symbolique, à utiliser avec prudence.

2

À l'aide de PowerShell, sur au moins le système d'exploitation Windows, vous pouvez trouver des liens symboliques dans n'importe quel répertoire donné, tels que les suivants:

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

Une alternative plus concise serait d'utiliser Get-ChildIteml'alias de ls:

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

Et vous pouvez obtenir des informations pertinentes sur un lien symbolique en effectuant l'une des opérations suivantes:

Obtenez l'élément de fichier et affichez sa propriété Target . La cible étant la "valeur" du lien symbolique. De plus, les signatures de méthode ou de commande pour créer des liens symboliques lors de la juxtaposition entre les systèmes d'exploitation, les noms d'arguments de: `` cible '', `` chemin '' et / ou `` valeur '' peuvent avoir des significations différentes de celles d'une autre signature de méthode sur un système d'exploitation différent.

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

Obtenez l'élément de fichier et affichez sa propriété LinkType . Un élément avec une valeur LinkType de SymbolicLink signifie que c'est bien, symbolique.

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

Obtenez l'élément de fichier et affichez sa propriété Mode . Un élément avec ldans la valeur Mode indique qu'il s'agit d'un lien symbolique.

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

Obtenez l'élément de fichier et affichez sa propriété Attributes . Un élément attribué avec une valeur ReparsePoint peut être indicatif d'un lien symbolique.

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

1

Ne pas utiliser fsutilpour vérifier si un élément est un lien symbolique ou non. Au début, parce que errorlevel contient des erreurs, il reste parfois à 0 et un vrai dossier est considéré comme un lien symbolique. Le niveau d'erreur n'est pas fiable.

Un problème avec findest parce que find "Symbolic Link"c'est possible en anglais, mais pas dans d'autres langues.

La bonne façon est de rechercher à partir des attributs:

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

Les attributs obtenus avec% a sont "drahscotlep" et "l" est pour le lien symbolique.


0

Voici un script bash cygwin pour enregistrer les liens symboliques, ajoutez vos dossiers préférés à la première ligne

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

0

À Powershell:

dir | select Name, LinkType

2
Surtout parce que c'est une vieille question qui a déjà de bonnes réponses, expliquer ce que votre réponse ajoute et ce que fait chaque partie de la commande est un moyen facile de l'améliorer.
music2myear

0

tous les crédits à @SecurityAndPrivacyGuru , [cmd]

script / fonction batch complet qui lit le lien symbolique {| s dans le dossier} et affiche la liste avec eux et leurs chemins cibles

@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

0

Si vous voulez vraiment utiliser fsutil, vous pouvez utiliser les deux techniques pour éviter l'échec du niveau d'erreur. (J'utilise ver> nul pour réinitialiser le niveau d'erreur)

: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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.