Перевірка, де символізується символічне посилання в Windows 7


24

Як у Windows 7 можна перевірити, чи файл є символічним посиланням чи ні, чи папка є з'єднанням чи ні, і як я можу перевірити, куди вони вказують (у випадку, якщо вони є посиланням / з'єднанням). Як в Провіднику, так і в командному рядку.

Дуже важливо мати спосіб зробити це з командного рядка, щоб знати, як дублювати символічні посилання на іншому комп'ютері, коли ви хочете зробити точну репліку дерева папок.

Якщо я клацніть правою кнопкою миші на файл і поставте галочку "Властивості", я не можу знайти жодних ознак того, що це символічне посилання.

Відповіді:


26

Команда dir dir /a може це зробити:

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]

Крім того, ви можете використовувати Провідник Windows:

Right click column, More, Link Target

Це не працює в Windows 7 (Microsoft Windows [Версія 6.1.7601])
gonzalezea

1
@gonzalezea так, це так. Він працював з Windows 7 ще в 2012 році, коли я опублікував це, і він працює і зараз
Стівен Пенні

Можливо, не так очевидно для нових користувачів, це рішення командного рядка. Користувач повинен відкрити командний рядок, а потім змінити каталог (за допомогою команди CD) на каталог, що містить символічне посилання, після чого введіть команду DIR і натисніть клавішу "enter". Запуск команди DIR у неправильному каталозі - поширена помилка. Але зрозуміло, якщо ви не впевнені, в якому каталозі знаходиться символьне посилання (не завжди очевидно, оскільки графічний інтерфейс Windows не чітко повідомляє про те, чи містить конкретний каталог якісь посилання або з'єднання). Шукайте ярлик, який має тип FILE FOLDER замість SHORTCUT .
Ed999

2
Поле цілі посилання порожнє для Windows 7
Ronen Festinger

1
з командного рядка слід ввести, dir /aа потім натиснути Enter. Якщо не включити / a, windows не відображає точки з'єднання. Ви можете спробувати різницю між dirі dir /aв каталозі\Users\YourUsername
Паулюс

4

Скопійований із StackOverFlow , я просто використав цей рядок, і він працює

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

Пояснення :

З MSDN про FSUtil: виконує завдання, пов’язані з таблицею розподілу файлів (FAT) та файловими системами NTFS, такими як керування точками повторного аналізу, управління розрідженими файлами або демонтаж тома. Якщо він використовується без параметрів, fsutil відображає список підтримуваних підкоманд.

Для нашого використання нам просто важливо, щоб він виводив рядок із символічною посиланням у ньому, якщо він символічний, який ми тоді find, і якщо це findвдається, ми виводимо одне, якщо це не так, ми виводимо щось інше.

Примітки :

  • Цитати навколо назви папки потрібні, якщо шлях має пробіли.
  • Він дає той самий вихід, чи папка не існує, чи це не посилання, використовуйте з обережністю.

2

Використовуючи PowerShell, принаймні в ОС Windows, ви можете знайти символічні посилання в будь-якій заданій директорії, такі як:

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

Більш короткою альтернативою було б використання Get-ChildItemпсевдоніма ls:

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

І ви можете отримати відповідну інформацію на символічному посиланні, виконавши будь-яке з наступних дій:

Отримайте елемент файлу та виведіть його властивість Target . Ціль - це "значення" символічного посилання. Крім того, підписи методу або команди для створення символьних посилань під час розміщення між операційними системами, назви аргументів: 'target', 'path' та / або 'value' можуть містити різні значення, ніж інший підпис методу в іншій ОС.

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

Отримайте елемент файлу та виведіть його властивість LinkType . Елемент зі значенням LinkType SymbolicLink означає, що він, ну, символічний.

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

Отримайте елемент файлу та виведіть його властивість Mode . Елемент зі lзначенням Mode вказує на те, що він є символічним посиланням.

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

Отримайте елемент файлу та виведіть його властивості Attributes . Елемент, присвоєний значенню ReparsePoint, може вказувати на символічне посилання.

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

1

Не використовуйте fsutilдля перевірки, чи є елемент символічним посиланням чи ні. Спочатку, оскільки на рівні помилок є помилки, тому іноді він залишається рівним 0 і справжня папка розглядається як символічне посилання. Помилку рівня не можна довіряти

Проблема findполягає в тому, що find "Symbolic Link"це можливо англійською мовою, а не іншими мовами.

Хороший спосіб - пошук за атрибутами:

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

Атрибути, отримані з% a, є "drahscotlep", а "l" - символічне посилання.


0

Ось скрипт базування cygwin, щоб зберегти посилання, додати улюблені папки до першого рядка

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
Тим більше, що це старе питання, на яке вже є хороші відповіді, пояснюючи, що додає ваша відповідь і що робить кожна частина команди, це простий спосіб зробити її кращою.
music2myear

0

всі кредити для @SecurityAndPrivacyGuru , [cmd]

повний пакетний сценарій / функція, яка читає символьне посилання {| s у папці} та виводить список із ними та їх цільовими шляхами

@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

Якщо ви дійсно хочете використовувати fsutil, ви можете скористатися обома техніками, щоб не допустити помилок. (Я використовую ver> nul для скидання рівня помилок)

: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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.