Проверка, на что указывает символическая ссылка в Windows 7

24

В Windows 7, как я могу проверить, является ли файл символической ссылкой или нет, является ли папка соединением или нет, и как я могу проверить, куда они указывают (в случае, если они являются символической ссылкой / соединением). И в проводнике, и в командной строке.

Очень важно иметь способ сделать это из командной строки, чтобы знать, как дублировать символические ссылки на другом компьютере, когда вы хотите создать точную копию дерева папок.

Если я щелкну правой кнопкой мыши по файлу и выберу «Свойства», я не смогу найти никаких признаков того, что это символическая ссылка.

BearCode
источник

Ответы:

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

Right click column, More, Link Target
Стивен Пенни
источник
Это не работает в Windows 7 (Microsoft Windows [Версия 6.1.7601])
gonzalezea
1
@gonzalezea да, это так. Он работал с Windows 7 еще в 2012 году, когда я опубликовал это, и теперь он тоже работает
Стивен Пенни
Возможно, это не так очевидно для новых пользователей, это решение командной строки. Пользователь должен открыть командную строку, затем изменить каталог (с помощью команды CD) на каталог, содержащий символическую ссылку, затем ввести команду DIR и нажать клавишу ввода. Выполнение команды DIR в неправильном каталоге является распространенной ошибкой. Но это понятно, если вы не уверены, в каком каталоге находится символическая ссылка (это не всегда очевидно, поскольку графический интерфейс Windows явно не сообщает вам, содержит ли конкретный каталог какие-либо символические ссылки или соединения). Ищите ярлык, который имеет тип FILE FOLDER вместо SHORTCUT .
Ed999
2
Целевое поле ссылки пусто в Windows 7
Ронен Фестингер
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
marckassay
источник
1

Не используйте, fsutilчтобы проверить, является ли элемент символической ссылкой или нет. Во-первых, потому что errorlevel имеет ошибки, поэтому иногда он остается равным 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 bash для сохранения символических ссылок, добавления ваших любимых папок в первую строку

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
Целес
источник