Verificando para onde um link simbólico aponta no Windows 7

24

No Windows 7, como posso verificar se um arquivo é um link simbólico ou não, se uma pasta é uma junção ou não e como posso verificar para onde estão apontando (no caso de ligação simbólica / junção). Tanto no Explorer quanto na linha de comando.

É muito importante ter uma maneira de fazer isso na linha de comando, para saber como duplicar links simbólicos em outro computador quando você quiser fazer uma réplica exata de uma árvore de pastas.

Se eu clicar com o botão direito do mouse em um arquivo e marcar "Propriedades", não encontro nenhuma indicação de que seja um link simbólico.

BearCode
fonte

Respostas:

26

O comando dir dir /a pode fazer isso:

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]

Como alternativa, você pode usar o Windows Explorer:

Right click column, More, Link Target
Steven Penny
fonte
Isso não funciona no Windows 7 (Microsoft Windows [versão 6.1.7601])
gonzalezea
1
@gonzalezea sim, faz. Ele trabalhou com o Windows 7 de volta em 2012, quando eu postei isso, e ele funciona agora também
Steven Penny
Talvez não seja tão óbvio para novos usuários, esta é uma solução de linha de comando. O usuário deve abrir um prompt de comando, alterar o diretório (usando o comando CD) para um diretório que contém um link simbólico, digite o comando DIR e pressione a tecla 'enter'. A execução do comando DIR no diretório errado é um erro comum. Mas é compreensível, a menos que você tenha certeza de qual diretório um link simbólico está (nem sempre óbvio, pois a GUI do Windows não informa explicitamente se um diretório específico contém links simbólicos ou junções). Procure um atalho que tenha o tipo FILE FOLDER em vez de ATALHO .
Ed999
2
O campo de destino do link está vazia no windows 7
Ronen Festinger
1
na linha de comando, digite dir /ae pressione Enter. Se você não incluir o / a, o Windows não listará pontos de junção. Você pode tentar a diferença entre dire dir /ano diretório\Users\YourUsername
Paulus
4

Copiado de StackOverFlow , eu apenas usei esta linha e funciona

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

Explicação :

Do MSDN sobre FSUtil: Executa tarefas relacionadas aos sistemas de arquivos FAT (tabela de alocação de arquivos) e NTFS, como gerenciamento de pontos de nova análise, gerenciamento de arquivos esparsos ou desmontagem de um volume. Se for usado sem parâmetros, o fsutil exibirá uma lista de subcomandos suportados.

Para nosso uso, apenas nos preocupamos com o fato de que ele gera uma linha que contém "Link Simbólico", se for simbólico, e então find, e se findfor bem-sucedido, produzimos uma coisa, se não, produzimos outra coisa.

Notas :

  • As aspas ao redor do nome da pasta são necessárias se o caminho tiver espaços.
  • Dá a mesma saída, se a pasta não existe ou não é um link simbólico, use com cuidado.
Daniel K.
fonte
2

Usando o PowerShell, pelo menos no sistema operacional Windows, você pode encontrar links simbólicos em qualquer diretório, como o seguinte:

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

Uma alternativa mais concisa seria usar Get-ChildItemo alias de ls:

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

E você pode obter informações relevantes em um link simbólico, seguindo um destes procedimentos:

Obtenha o item de arquivo e produza sua propriedade Target . O alvo é o "valor" do link simbólico. Além disso, assinaturas de método ou comando para criar links simbólicos ao justapor entre sistemas operacionais, os nomes dos argumentos de: 'target', 'path' e / ou 'value' podem ter significados diferentes dos de outra assinatura de método em um SO diferente.

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

Obtenha o item de arquivo e produza sua propriedade LinkType . Um item com um valor LinkType de SymbolicLink significa que é, assim, simbólico.

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

Obtenha o item de arquivo e produza sua propriedade Mode . Um item com lno valor Mode indica que é um link simbólico.

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

Obtenha o item de arquivo e produza sua propriedade Attributes . Um item atribuído com um valor ReparsePoint pode ser indicativo para um link simbólico.

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

Não use fsutilpara verificar se um item é um link simbólico ou não. No início, como o errorlevel possui erros, às vezes permanece como 0 e uma pasta real é vista como um link simbólico. O nível de erro não é confiável.

Um problema findé porque find "Symbolic Link"é possível em inglês, mas não em outros idiomas.

A boa maneira é procurar pelos 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!
)

Os atributos obtidos com% a são "drahscotlep" e "l" é para o link simbólico.

Celes
fonte
0

Aqui está um script cygwin bash para salvar links simbólicos, adicionar suas pastas favoritas à primeira linha

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

Em Powershell:

dir | select Name, LinkType
John
fonte
2
Especialmente porque essa é uma pergunta antiga que já possui boas respostas, explicar o que sua resposta adiciona e o que cada parte do comando está fazendo é uma maneira fácil de melhorá-la.
music2myear
0

todos os créditos para @SecurityAndPrivacyGuru , [cmd]

script / função de lote completo que lê links simbólicos {| s na pasta} e lista de saídas com eles e seus caminhos 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
fonte
0

Se você realmente deseja usar o fsutil, pode usar as duas técnicas para evitar falhas no nível de erro. (Eu uso ver> nul para redefinir o nível de erro)

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