родная альтернатива Windows для ln -s
- mklink
.
Есть ли родная альтернатива для readlink
? Или как изначально определить, является ли файл символической ссылкой?
родная альтернатива Windows для ln -s
- mklink
.
Есть ли родная альтернатива для readlink
? Или как изначально определить, является ли файл символической ссылкой?
Я не верю, что существует какой-либо инструмент, прямо эквивалентный 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%
- это результат без первого или последнего символа.
<SYMLINKD>
, но обратите внимание, что dir mysymlinkdir
будет отображать содержимое этого каталога символической ссылки, а не сводную информацию. Так что, возможно, dir |find "mysymlinkdir" |find "<SYMLINKD>"
будет полезной конструкцией.
- person Lars Rohrbach; 16.11.2012
dir
не распознается как команда в Windows 7 - по крайней мере, на моей машине.
- person kaiser; 08.08.2014
dir
- это внутренняя команда cmd.exe, а не исполняемый файл.
- person foxidrive; 08.03.2016
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
C:\app\
и C:\app2\
являются символическими ссылками на каталоги, и вам нужна цель для C:\app
. Ваш код должен проверять токен 5. Повторно проанализируйте приложение [target-path-string] и верните только его в качестве ответа.
- person Skip R; 20.02.2021