1 (изменено: Rumata, 2016-03-07 13:45:19)

Тема: CMD/BAT: Аналог readlink

Мир unix богат на самые различные утилиты. Некоторые из них даже могут дублировать друг друга. Мир windows в этом плане очень беден. Но кое-что можно исправить.

Юникс-команда readlink печатает значение символической ссылки. Попытаемся съэмулировать:


@echo off

for /f "tokens=*" %%f in ( ' 
	dir /b /al "%~1*" 
' ) do for /f "tokens=1,2,3 delims=[]" %%a in ( ' 
	dir /al "%~dp1%%f*"  ^| findstr "<SYMLINK> <SYMLINKD> <JUNCTION>" 
' ) do (
	echo:%%~b
)

Пример работы:

C:\>dir /b /al
Documents and Settings

C:\>readlink
C:\Users

В первом приближении работает, но есть недостатки:

1. работает некорректно для файлов,каталогов, содержащих в имени символы "[" и "]"
2. может дублировать вывод
3. ошибается при поиске симлинков не в корне диска readlink c:

Обсуждение по теме:
http://stackoverflow.com/questions/1329 … s/13358046

( 2 * b ) || ! ( 2 * b )

2

Re: CMD/BAT: Аналог readlink

Rumata пишет:

Мир windows в этом плане очень беден.

Возможно, но закладываться на это все же не стОит. Например, те же точки повтороной обработки можно посмотреть с помощью fsutil:

fsutil reparsepoint query C:\Users

Есть PowerShell, из стороннего - Cygwin, последний readlink устанавливает по дефолту. Много чего есть, словом.

3

Re: CMD/BAT: Аналог readlink

Идея изначально стоит определить родные, виндовые симлинки минимальными средствами самой же винды.

В cygwin свои заморочки. Во первых это сторонний комплект, изначально неродной. Во-вторых, readlink из cygwin не делает различий между
- симлинками, созданными в винде (командой mklink) и
- симлинками, созданными в cygwin (командой ln -s).

Powersell - это хорошо и его можно включить в список решений, надо только накодить.

fsutil сложно. Как вычленить полезную информацию в разных случаях


C:\>fsutil reparsepoint query "C:\Documents and Settings"
Error:  Access is denied.
C:\>fsutil reparsepoint query "C:\System Volume Information"
Error:  Access is denied.

C:\PROGS\vendors>dir clink*
 Volume in drive C is PC COE
 Volume Serial Number is DC8B-7390

 Directory of C:\PROGS\vendors

2016-01-14  15:53    <DIR>          clink
2016-03-08  13:10    <SYMLINKD>     clink-d [clink]
2016-03-08  13:10    <JUNCTION>     clink-j [C:\PROGS\vendors\clink]
               0 File(s)              0 bytes
               3 Dir(s)  66 870 931 456 bytes free

C:\PROGS\vendors>fsutil reparsepoint query clink-d
Reparse Tag Value : 0xa000000c
Tag value: Microsoft
Tag value: Name Surrogate
Tag value: Symbolic Link

Reparse Data Length: 0x00000020
Reparse Data:
0000:  0a 00 0a 00 00 00 0a 00  01 00 00 00 63 00 6c 00  ............c.l.
0010:  69 00 6e 00 6b 00 63 00  6c 00 69 00 6e 00 6b 00  i.n.k.c.l.i.n.k.

C:\PROGS\vendors>fsutil reparsepoint query clink-j
Reparse Tag Value : 0xa0000003
Tag value: Microsoft
Tag value: Name Surrogate
Tag value: Mount Point
Substitue Name offset: 0
Substitue Name length: 52
Print Name offset:     54
Print Name Length:     44
Substitute Name:       \??\C:\PROGS\vendors\clink
Print Name:            C:\PROGS\vendors\clink

Reparse Data Length: 0x0000006c
Reparse Data:
0000:  00 00 34 00 36 00 2c 00  5c 00 3f 00 3f 00 5c 00  ..4.6.,.\.?.?.\.
0010:  43 00 3a 00 5c 00 50 00  52 00 4f 00 47 00 53 00  C.:.\.P.R.O.G.S.
0020:  5c 00 76 00 65 00 6e 00  64 00 6f 00 72 00 73 00  \.v.e.n.d.o.r.s.
0030:  5c 00 63 00 6c 00 69 00  6e 00 6b 00 00 00 43 00  \.c.l.i.n.k...C.
0040:  3a 00 5c 00 50 00 52 00  4f 00 47 00 53 00 5c 00  :.\.P.R.O.G.S.\.
0050:  76 00 65 00 6e 00 64 00  6f 00 72 00 73 00 5c 00  v.e.n.d.o.r.s.\.
0060:  63 00 6c 00 69 00 6e 00  6b 00 00 00              c.l.i.n.k...
( 2 * b ) || ! ( 2 * b )