Comprobando dónde apunta un enlace simbólico en Windows 7

24

En Windows 7, ¿cómo puedo verificar si un archivo es un enlace simbólico o no? Tanto en Explorer como en la línea de comando.

Es muy importante tener una forma de hacerlo desde la línea de comandos, para saber cómo duplicar enlaces simbólicos en otra computadora cuando desea hacer una réplica exacta de un árbol de carpetas.

Si hago clic derecho en un archivo y verifico "Propiedades", no puedo encontrar ninguna indicación de que sea un enlace simbólico.

Código de oso
fuente

Respuestas:

26

El comando dir dir /a puede hacer esto:

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]

Alternativamente, puede usar el Explorador de Windows:

Right click column, More, Link Target
Steven Penny
fuente
Esto no funciona en Windows 7 (Microsoft Windows [Versión 6.1.7601])
gonzalezea
1
@gonzalezea sí, lo hace. Funcionó con Windows 7 en 2012 cuando publiqué esto, y ahora también funciona
Steven Penny
Quizás no sea tan obvio para los nuevos usuarios, esta es una solución de línea de comando. El usuario debe abrir un símbolo del sistema, luego cambiar el directorio (usando el comando CD) a un directorio que contenga un enlace simbólico, luego escriba el comando DIR y presione la tecla 'enter'. Ejecutar el comando DIR en el directorio incorrecto es un error común. Pero es comprensible, a menos que esté seguro de en qué directorio se encuentra un enlace simbólico (no siempre es obvio, ya que la GUI de Windows no le dice explícitamente si un directorio particular contiene enlaces simbólicos o uniones). Busque un acceso directo que tenga el tipo FOLD FOLDER en lugar de SHORTCUT .
Ed999
2
El campo de destino del enlace está vacío en Windows 7
Ronen Festinger
1
desde la línea de comando debe escribir y dir /aluego presionar Entrar. Si no incluye el / a, Windows no enumera los puntos de unión. Puede probar la diferencia entre diry dir /aen el directorio\Users\YourUsername
Paulus
4

Copiado de StackOverFlow , acabo de usar esta línea, y funciona

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

Explicacion :

Desde MSDN sobre FSUtil: realiza tareas relacionadas con la tabla de asignación de archivos (FAT) y los sistemas de archivos NTFS, como administrar puntos de análisis, administrar archivos dispersos o desmontar un volumen. Si se usa sin parámetros, fsutil muestra una lista de subcomandos compatibles.

Para nuestro uso, solo nos importa que genere una línea que tenga un "Enlace simbólico", si es simbólico, lo cual entonces find, y si findtiene éxito, sacamos una cosa, si no lo hace, sacamos otra.

Notas :

  • Las comillas alrededor del nombre de la carpeta son obligatorias si la ruta tiene espacios.
  • Da el mismo resultado si la carpeta no existe o si no es un enlace simbólico, úselo con precaución.
Daniel K.
fuente
2

Con PowerShell, al menos en el sistema operativo Windows, puede encontrar enlaces simbólicos en cualquier directorio dado, como los siguientes:

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

Una alternativa más concisa sería usar Get-ChildItemel alias de ls:

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

Y puede obtener información relevante sobre un enlace simbólico haciendo lo siguiente:

Obtenga el elemento del archivo y envíe su propiedad Target . El objetivo es el "valor" del enlace simbólico. Además, las firmas de métodos o comandos para crear enlaces simbólicos cuando se yuxtaponen entre sistemas operativos, los nombres de los argumentos de: 'target', 'path' y / o 'value' pueden tener significados diferentes que la firma de otro método en un sistema operativo diferente.

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

Obtenga el elemento del archivo y envíe su propiedad LinkType . Un elemento con un valor LinkType de SymbolicLink significa que es, bueno, simbólico.

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

Obtenga el elemento del archivo y envíe su propiedad Mode . Un elemento con lel valor de Modo indica que es un enlace simbólico.

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

Obtenga el elemento del archivo y envíe su propiedad Atributos . Un elemento atribuido con un valor de ReparsePoint puede ser indicativo de un enlace simbólico.

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

No lo use fsutilpara verificar si un artículo es un enlace simbólico o no. Al principio, porque errorlevel tiene errores, por lo que a veces permanece en 0 y una carpeta real se ve como un enlace simbólico. Errorlevel no se puede confiar.

Un problema findes porque find "Symbolic Link"es posible en inglés, pero no en otros idiomas.

La buena manera es buscar desde los atributos:

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

Los atributos que se obtienen con% a son "drahscotlep" y "l" es para enlace simbólico.

Celes
fuente
0

Aquí hay un script cygwin bash para guardar enlaces simbólicos, agregue sus carpetas favoritas a la primera línea

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

En Powershell:

dir | select Name, LinkType
John
fuente
2
Especialmente porque esta es una vieja pregunta que ya tiene buenas respuestas, explicar lo que agrega su respuesta y lo que cada parte del comando está haciendo es una manera fácil de mejorarla.
music2myear
0

todos los créditos a @SecurityAndPrivacyGuru , [cmd]

completa secuencia de comandos por lotes / función que lee el enlace simbólico {| s en la carpeta} y muestra la lista con ellos y sus rutas de destino

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

Si realmente desea usar fsutil, puede usar ambas técnicas para evitar fallas en el nivel de error. (Uso ver> nul para restablecer el nivel de error)

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