scar61
Goto Top

Orginalpfad eines verlinkten Verzeichnisses oder einer verlinkten Datei herausfinden

Hallo zusammen,

gibt es in einem Batch eine Möglichkeit herauszufinden, ob ein eingegebenes Verzeichnis irgendwo einen Link enthält?
Hintergrund: Ich möchte für verlinkte Pfade oder Dateien den Orginalpfad herausfinden.

Zur Veranschaulichung folgendes Beispiel:
'C:\a\b\c\d\f.txt' enthält in 'c' einen Verzeichnislink, der auf 'D:\a\b\c' verweist.
Wenn ich jetzt 'C:\a\b\c\d\f.txt' in den Batch hineingebe, möchte ich 'D:\a\b\c\d\f.txt' herausbekommen.

Weiß jemand, ob so etwas möglich ist?

Vielen Dank für eure Mühe
Scar61

Content-Key: 254177

Url: https://administrator.de/contentid/254177

Printed on: April 24, 2024 at 15:04 o'clock

Member: rubberman
rubberman Nov 07, 2014 updated at 17:05:46 (UTC)
Goto Top
Hallo Scar61,

mit Batch pur geht das sicher nicht.

Aber wie soll ich mir das vorstellen? Das Script soll den gesamten Pfad ablaufen und nach *.LNK Dateien suchen? Was wenn mehrere Verknüpfungen gefunden werden? Wie sieht das denn in der Realität aus?

Grüße
rubberman
Member: colinardo
colinardo Nov 07, 2014, updated at Nov 13, 2014 at 15:57:41 (UTC)
Goto Top
Hallo scar61,
meinst du symbolische Verzeichnis-Verknüpfungen (Junctions) ?
Dieses Sysinternals-Tool zeigt sie dir an:
"Junction" von Mark Russinovich

Grüße Uwe
Member: Scar61
Scar61 Nov 13, 2014 at 16:04:31 (UTC)
Goto Top
Hallo Uwe,

war gerade ein paar Tage offline...

Ja, ich meine die seit Windows 7 offiziell verfügbaren symbolischen Links, wie man sie von UNIX Betriebssystemen kennt (kann man mittlerweile auch mit dem eingebauten Kommando mklink herstellen).
Letztendlich fehlt mir im Skript die Möglichkeit sprachunabhängig zu erkennen, ob ein in meinem Pfad enthaltener Teilpfad ein Verzeichnis, eine Datei oder ein Link ist. Wenn ich wüsste, wie ich das sicher erkennen könnte, bekäme ich den Rest per Batch schon hin.
So etwas wie 'GetRealPath()' wird es ja nicht 'out of the box' geben.

Grüße Scar61
Member: colinardo
Solution colinardo Nov 13, 2014, updated at Nov 14, 2014 at 15:07:38 (UTC)
Goto Top
In batch kannst du dir symbolische Links so für ein Verzeichnis inkl. Unterordner anzeigen lassen
dir C:\test /AL /S
in der Ausgabe steht dann der Realpfad hinter dem Dateinamen in eckigen Klammern. den kannst du dir dann ja mit einer FOR-Schleife extrahieren.

Das ganze kannst du natürlich auch umdrehen in nur Elemente anzeigen lassen die keine symbolischen Verknüpfungen sind
dir C:\test /B /A-L /S

Mit VBS kann man sich so anzeigen lassen ob ein Ordner oder eine Datei ein symbolischer Link ist.
Const REPARSE_POINT = &h400
Set fso = CreateObject("Scripting.FileSystemObject")  
parsefolders fso.GetFolder(wscript.arguments(0))
sub parsefolders(fldr)
	for each f in fldr.files
		If (f.Attributes And REPARSE_POINT) = REPARSE_POINT Then
  			wscript.echo "[SYMLINK-FILE] " & f.path  
		End If
	next
	for each folder in fldr.subfolders
		If (folder.Attributes And REPARSE_POINT) = REPARSE_POINT Then
  			wscript.echo "[SYMLINK-FOLDER] " & folder.path  
		else
			parsefolders folder
		End If
	next
end sub
set fso = nothing
Das Script kannst du dann so auf ein Verzeichnis loslassen welches dann rekursiv durchlaufen wird und symbolische Links und Ordner ausgegeben werden:
cscript //NOLOGO searchlinks.vbs "C:\deinordner" 
Grüße Uwe
Member: rubberman
Solution rubberman Nov 13, 2014, updated at Nov 14, 2014 at 14:53:31 (UTC)
Goto Top
Hallo Uwe.

in der Ausgabe steht dann der Realpfad hinter dem Dateinamen in eckigen Klammern. den kannst du dir dann ja mit einer FOR-Schleife extrahieren.
Ach du meine Güte. Hast du das mal mit ...
'C:\a\b\c\d\f.txt' enthält in 'c' einen Verzeichnislink, der auf 'D:\a\b\c' verweist.
Wenn ich jetzt 'C:\a\b\c\d\f.txt' in den Batch hineingebe, möchte ich 'D:\a\b\c\d\f.txt' herausbekommen.
... in Zusammenhang gebracht?

Ich habe mich gerade mal daran versucht. Buggy, aber sollte in den meisten Fällen funktionieren.
@echo off &setlocal DisableDelayedExpansion

set "filepath=C:\a\b\c\d\f.txt"  


set "n=0"  
for %%i in ("%filepath:\=" "%") do (  
  setlocal EnableDelayedExpansion
  for /f %%j in ("!n!") do (  
    endlocal
    set "f_%%j=%%~i"  
  )
  set /a "n+=1"  
)

set "newpath=%f_0%"  
for /l %%h in (1 1 %n%) do (
  set "repl="  
  setlocal EnableDelayedExpansion
  for /f "tokens=3*" %%i in ('2^>nul dir /al "!newpath!\" ^|findstr /rc:"\<<SYMLINKD>\>"') do (  
    if "!!"=="" endlocal  
    set "name=%%j"  
    setlocal EnableDelayedExpansion
    for %%k in ("!name:[=" "!") do (  
      endlocal
      set "target=%%~k"  
      setlocal EnableDelayedExpansion
    )

    for /f "delims=" %%k in (" [!target!") do (  
      if "!name:%%k=!"=="!f_%%h!" (  
        for /f "delims=" %%l in ("!target:~,-1!") do (  
          endlocal
          set "newpath=%%l"  
          set "repl=1"  
        )
      ) else endlocal
    )

  )

  if not defined repl (
    setlocal EnableDelayedExpansion
    for /f "delims=" %%k in ("!newpath!") do (  
      for /f "delims=" %%l in ("!f_%%h!") do (  
        endlocal
        set "newpath=%%k\%%l"  
      )
    )
  )

)



echo "%newpath%"  
pause

Grüße
rubberman
Member: Scar61
Scar61 Nov 14, 2014 at 14:50:46 (UTC)
Goto Top
Super,

vielen Dank, das hilft. Weißt du noch ab welchem Windows es diesen 'l' Typ im dir Kommando gibt?

Danke
Scar61
Member: colinardo
colinardo Nov 14, 2014 updated at 14:54:27 (UTC)
Goto Top
Zitat von @Scar61:
vielen Dank, das hilft. Weißt du noch ab welchem Windows es diesen 'l' Typ im dir Kommando gibt?
Ich meine erst ab Vista, unter XP gab's den noch nicht.
Member: Scar61
Scar61 Nov 14, 2014 at 15:00:10 (UTC)
Goto Top
Danke für deine Idee.
Den Ablauf hatte ich ähnlich, mir hat nur die Erkennung der Links gefehlt, was ja jetzt mit dem 'dir /b /al %f%' sogar sprachunabhängig und generisch geht.

Ist schön, wenn man feststellt, dass man hier immer wieder Leute finden die einen verstehen und so konstruktiv weiterhelfen.

Grüße
Scar61