Verifica della posizione di un collegamento simbolico in Windows 7


24

In Windows 7, come posso verificare se un file è un collegamento simbolico o meno, se una cartella è un nodo o no, e come posso controllare dove stanno puntando (nel caso in cui siano link simbolici / nodo). Sia in Explorer che nella riga di comando.

È molto importante avere un modo per farlo dalla riga di comando, al fine di sapere come duplicare i collegamenti simbolici su un altro computer quando si desidera eseguire una replica esatta di un albero di cartelle.

Se clicco con il tasto destro su un file e controllo "Proprietà", non trovo alcuna indicazione che si tratti di un collegamento simbolico.

Risposte:


26

Il comando dir dir /a può fare questo:

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]

In alternativa, puoi utilizzare Esplora risorse:

Right click column, More, Link Target

Questo non funziona in Windows 7 (Microsoft Windows [Versione 6.1.7601])
gonzalezea

1
@gonzalezea sì, lo fa. Ha funzionato con Windows 7 nel 2012 quando l'ho pubblicato, e funziona anche adesso
Steven Penny,

Forse non è così ovvio per i nuovi utenti, questa è una soluzione da riga di comando. L'utente deve aprire un prompt dei comandi, quindi modificare la directory (utilizzando il comando CD) in una directory contenente un collegamento simbolico, quindi digitare il comando DIR e premere il tasto 'Invio'. L'esecuzione del comando DIR nella directory errata è un errore comune. Ma comprensibile, a meno che non si sia sicuri in quale directory si trovi un collegamento simbolico (non sempre ovvio, poiché la GUI di Windows non ti dice esplicitamente se una determinata directory contiene collegamenti simbolici o giunzioni). Cerca un collegamento che abbia il tipo FILE FOLDER anziché SHORTCUT .
Ed999,

2
Il campo target del collegamento è vuoto su Windows 7
Ronen Festinger,

1
dalla riga di comando è necessario digitare, dir /aquindi premere Invio. Se non si include / a, Windows non elenca i punti di giunzione. Puoi provare la differenza tra dire dir /asulla directory\Users\YourUsername
Paulus il

4

Copiato da StackOverFlow , ho appena usato questa linea e funziona

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

Spiegazione :

Da MSDN a proposito di FSUtil: esegue attività correlate alla tabella di allocazione dei file (FAT) e ai file system NTFS, come la gestione dei punti di analisi, la gestione dei file di analisi o lo smontaggio di un volume. Se viene utilizzato senza parametri, fsutil visualizza un elenco di sottocomandi supportati.

Per il nostro uso, ci preoccupiamo solo che emetta una linea che contenga "Collegamento simbolico", se è simbolico, che quindi find, e se ci findriesce, produciamo una cosa, se non lo fa, produciamo qualcos'altro.

Note :

  • Le virgolette attorno al nome della cartella sono necessarie se il percorso contiene spazi.
  • Fornisce lo stesso output indipendentemente dal fatto che la cartella non esista o non sia un collegamento simbolico, da usare con cautela.

2

Utilizzando PowerShell, almeno sul sistema operativo Windows, è possibile trovare collegamenti simbolici in una determinata directory, ad esempio quanto segue:

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

Un'alternativa più concisa sarebbe quella di usare Get-ChildIteml'alias ls:

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

E puoi ottenere informazioni pertinenti su un collegamento simbolico effettuando una delle seguenti operazioni:

Ottieni l'elemento del file e genera la sua proprietà Target . L'obiettivo è il "valore" del collegamento simbolico. Inoltre, le firme dei metodi o dei comandi per la creazione di collegamenti simbolici durante la giustapposizione tra sistemi operativi, i nomi degli argomenti di 'target', 'path' e / o 'value' possono avere significati diversi rispetto a un'altra firma del metodo su un sistema operativo diverso.

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

Ottieni l'elemento del file e genera la proprietà LinkType . Un elemento con un valore LinkType di SymbolicLink significa che è, beh, simbolico.

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

Ottieni l'elemento del file e genera la sua proprietà Mode . Un elemento con lnel valore Modalità indica che si tratta di un collegamento simbolico.

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

Ottieni l'elemento del file e genera la sua proprietà Attributes . Un elemento con un valore attribuito ReparsePoint forse indicativi di un simbolico-link.

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

1

Non utilizzare fsutilper verificare se un elemento è un collegamento simbolico o meno. Inizialmente perché il livello di errore presenta errori, quindi a volte rimane a 0 e una cartella reale viene visualizzata come collegamento simbolico. Il livello di errore non può essere considerato attendibile.

Un problema findè perché find "Symbolic Link"è possibile in inglese, ma non in altre lingue.

Il buon modo è cercare dagli attributi:

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

Gli attributi ottenuti con% a sono "drahscotlep" e "l" è per il collegamento simbolico.


0

Ecco uno script cygwin bash per salvare i collegamenti simbolici, aggiungere le tue cartelle preferite alla prima riga

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

In Powershell:

dir | select Name, LinkType

2
Soprattutto perché questa è una vecchia domanda che ha già buone risposte, spiegando cosa aggiunge la tua risposta e cosa sta facendo ogni parte del comando è un modo semplice per migliorarla.
music2myear,

0

tutti i crediti verso @SecurityAndPrivacyGuru , [cmd]

script / funzione batch completi che leggono il link simbolico {| s nella cartella} e restituiscono l'elenco con loro e i loro percorsi target

@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

Se vuoi davvero usare fsutil, puoi usare entrambe le tecniche per evitare errori dovuti a errori. (Uso ver> nul per ripristinare il livello di errore)

: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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.