Родная альтернатива для readlink в Windows

родная альтернатива Windows для ln -s - mklink.

Есть ли родная альтернатива для readlink? Или как изначально определить, является ли файл символической ссылкой?


person Honza Štefl    schedule 08.11.2012    source источник


Ответы (2)


Я не верю, что существует какой-либо инструмент, прямо эквивалентный readlink. Но вы можете видеть в выводе dir, является ли элемент символической ссылкой или нет, поэтому вы все равно можете определить это из командной строки или в скрипте.

Проверьте, является ли это символической ссылкой или нет

Вы можете легко проверить, является ли данный файл символической ссылкой, используя такой синтаксис:

 dir mysymlink  | find "<SYMLINK>" >NUL
 if not errorlevel 1  echo. It's a symlink!

Errorlevel будет 0 в случае, если "<SYMLINK>" найден, и будет 1 в противном случае.

Определите цель символической ссылки

Определение фактической цели символической ссылки - другой вопрос, и, на мой взгляд, не такой простой. Результат dir mysymlink | find "<SYMLINK>" может выглядеть как

11/13/2012  12:53 AM    <SYMLINK>      mysymlink [C:\Windows\Temp\somefile.txt]

Вы можете разобрать это, но некоторые символы затрудняют работу со всеми в одной переменной, поэтому мне было легче иметь дело с временным файлом:

 dir mysymlink | find "<SYMLINK>" > temp.txt
 for /f "tokens=6" %i in (temp.txt) do @echo %i

Это дает результат типа [C:\Windows\Temp\somefile.txt]. (Не забудьте использовать %%i в любых пакетных сценариях; указанное выше находится в командной строке.)

Чтобы получить результат без скобок, вы можете сделать что-то вроде:

 dir mysymlink | find "<SYMLINK>" > temp.txt
 for /f "tokens=6" %i in (temp.txt) do set answer=%i
 echo %answer:~1,-1%

Переменная %answer% содержит результат в квадратных скобках, поэтому %answer:~1,-1% - это результат без первого или последнего символа.

person Lars Rohrbach    schedule 13.11.2012
comment
Спасибо за исчерпывающий ответ. Хорошо, у нас есть решение для файлов, а что насчет каталогов, какие еще непустые каталоги с символическими ссылками в них? - person Honza Štefl; 16.11.2012
comment
Вы можете применить некоторые из вышеперечисленных методов к каталогам символических ссылок. Они обозначаются <SYMLINKD>, но обратите внимание, что dir mysymlinkdir будет отображать содержимое этого каталога символической ссылки, а не сводную информацию. Так что, возможно, dir |find "mysymlinkdir" |find "<SYMLINKD>" будет полезной конструкцией. - person Lars Rohrbach; 16.11.2012
comment
dir не распознается как команда в Windows 7 - по крайней мере, на моей машине. - person kaiser; 08.08.2014
comment
@kaiser dir - это внутренняя команда cmd.exe, а не исполняемый файл. - person foxidrive; 08.03.2016
comment
@LarsRohrbach DIR | find ... может вернуть 2 строки, если два каталога символических ссылок, например. mysymlinkdir и mysymlinkdir2 существуют, поэтому вам нужно проверить совпадение имени каталога, если вы его использовали. (Та же проблема в моем комментарии к другому ответу ниже). Возродил этот вопрос, поскольку я кодирую аналогичный сценарий для изменения каталогов на целевой каталог символической ссылки на каталог. - person Skip R; 20.02.2021

Нет необходимости перенаправлять стандартный вывод в файл temp.txt. Вы можете просто сделать это одной строкой:

for /f "tokens=6" %i in ('dir mysymlink ^| FIND "<SYMLINK>"') do @echo %i

Также обратите внимание, что описанный выше метод Ларса применяется только к "файловым" символическим ссылкам. Этот метод должен быть настроен для символических ссылок каталогов, поскольку при передаче каталога команде "dir" будет выведено фактическое содержимое этих каталогов (которое не будет там)

Итак, вы должны использовать:

for /f "tokens=6" %i in ('dir mysymlink* ^| FIND "<SYMLINKD>"') do @echo %i

Обратите внимание на включение * в вызове dir и добавление буквы «D» в FIND

Звездочка не позволит dir перечислить содержимое этого каталога.

Чтобы еще больше упростить процесс работы с символическими ссылками на файл или каталог, вы просто всегда включаете звездочку, а для аргумента FIND вы должны изменить его на частичное совпадение, чтобы оно совпадало с буквой D на конце или без нее.

for /f "tokens=6" %i in ('dir mysymlink* ^| FIND "<SYMLINK"') do @echo %i

И, наконец, поскольку этот метод фактически возвращает файл в скобках [] ... вам лучше разделить их, оставив вам последний метод:

for /f "tokens=2 delims=[]" %i in ('dir mysymlink* ^| FIND "<SYMLINK"') do @echo %i
person Dss    schedule 10.12.2014
comment
Код не работает повсеместно. Считайте, что C:\app\ и C:\app2\ являются символическими ссылками на каталоги, и вам нужна цель для C:\app. Ваш код должен проверять токен 5. Повторно проанализируйте приложение [target-path-string] и верните только его в качестве ответа. - person Skip R; 20.02.2021