Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Orginalpfad eines verlinkten Verzeichnisses oder einer verlinkten Datei herausfinden

Frage Entwicklung Batch & Shell

Mitglied: Scar61

Scar61 (Level 1) - Jetzt verbinden

07.11.2014, aktualisiert 14.11.2014, 980 Aufrufe, 8 Kommentare

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
Mitglied: rubberman
07.11.2014, aktualisiert um 18:05 Uhr
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
Bitte warten ..
Mitglied: colinardo
07.11.2014, aktualisiert 13.11.2014
Hallo scar61,
meinst du symbolische Verzeichnis-Verknüpfungen (Junctions) ?
Dieses Sysinternals-Tool zeigt sie dir an:
"Junction" von Mark Russinovich

Grüße Uwe
Bitte warten ..
Mitglied: Scar61
13.11.2014 um 17:04 Uhr
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
Bitte warten ..
Mitglied: colinardo
LÖSUNG 13.11.2014, aktualisiert 14.11.2014
In batch kannst du dir symbolische Links so für ein Verzeichnis inkl. Unterordner anzeigen lassen
01.
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
01.
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.
01.
Const REPARSE_POINT = &h400 
02.
Set fso = CreateObject("Scripting.FileSystemObject") 
03.
parsefolders fso.GetFolder(wscript.arguments(0)) 
04.
sub parsefolders(fldr) 
05.
	for each f in fldr.files 
06.
		If (f.Attributes And REPARSE_POINT) = REPARSE_POINT Then 
07.
  			wscript.echo "[SYMLINK-FILE] " & f.path 
08.
		End If 
09.
	next 
10.
	for each folder in fldr.subfolders 
11.
		If (folder.Attributes And REPARSE_POINT) = REPARSE_POINT Then 
12.
  			wscript.echo "[SYMLINK-FOLDER] " & folder.path 
13.
		else 
14.
			parsefolders folder 
15.
		End If 
16.
	next 
17.
end sub 
18.
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:
01.
cscript //NOLOGO searchlinks.vbs "C:\deinordner"
Grüße Uwe
Bitte warten ..
Mitglied: rubberman
LÖSUNG 13.11.2014, aktualisiert 14.11.2014
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.
01.
@echo off &setlocal DisableDelayedExpansion 
02.
 
03.
set "filepath=C:\a\b\c\d\f.txt" 
04.
 
05.
 
06.
set "n=0" 
07.
for %%i in ("%filepath:\=" "%") do ( 
08.
  setlocal EnableDelayedExpansion 
09.
  for /f %%j in ("!n!") do ( 
10.
    endlocal 
11.
    set "f_%%j=%%~i" 
12.
13.
  set /a "n+=1" 
14.
15.
 
16.
set "newpath=%f_0%" 
17.
for /l %%h in (1 1 %n%) do ( 
18.
  set "repl=" 
19.
  setlocal EnableDelayedExpansion 
20.
  for /f "tokens=3*" %%i in ('2^>nul dir /al "!newpath!\" ^|findstr /rc:"\<<SYMLINKD>\>"') do ( 
21.
    if "!!"=="" endlocal 
22.
    set "name=%%j" 
23.
    setlocal EnableDelayedExpansion 
24.
    for %%k in ("!name:[=" "!") do ( 
25.
      endlocal 
26.
      set "target=%%~k" 
27.
      setlocal EnableDelayedExpansion 
28.
29.
 
30.
    for /f "delims=" %%k in (" [!target!") do ( 
31.
      if "!name:%%k=!"=="!f_%%h!" ( 
32.
        for /f "delims=" %%l in ("!target:~,-1!") do ( 
33.
          endlocal 
34.
          set "newpath=%%l" 
35.
          set "repl=1" 
36.
37.
      ) else endlocal 
38.
39.
 
40.
41.
 
42.
  if not defined repl ( 
43.
    setlocal EnableDelayedExpansion 
44.
    for /f "delims=" %%k in ("!newpath!") do ( 
45.
      for /f "delims=" %%l in ("!f_%%h!") do ( 
46.
        endlocal 
47.
        set "newpath=%%k\%%l" 
48.
49.
50.
51.
 
52.
53.
 
54.
 
55.
 
56.
echo "%newpath%" 
57.
pause
Grüße
rubberman
Bitte warten ..
Mitglied: Scar61
14.11.2014 um 15:50 Uhr
Super,

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

Danke
Scar61
Bitte warten ..
Mitglied: colinardo
14.11.2014, aktualisiert um 15:54 Uhr
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.
Bitte warten ..
Mitglied: Scar61
14.11.2014 um 16:00 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung!

(2)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Batch & Shell
gelöst Aktueller Besitzer der aktuellen Datei herausfinden und in Variable schreiben (11)

Frage von Peter32 zum Thema Batch & Shell ...

Webentwicklung
HTML Output in eine txt Datei mit VisualBasicScript (2)

Frage von coca22COCA zum Thema Webentwicklung ...

Informationsdienste
gelöst Aktuelle Firefox MSI Datei!? (8)

Frage von Hendrik2586 zum Thema Informationsdienste ...

Virtualisierung
gelöst VMDK Datei vergrößern auf der Console welche Datei ist die richtige? (3)

Frage von fireskyer zum Thema Virtualisierung ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (15)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...