Attributabfrage einer Datei für Link
Ich möchte in einer Batchdatei mittels Abfrage ermitteln, ob eine vorhandene Datei ein Symlink oder ein Hardlink zu einer Datei ist.
Die Erstellung eines Hardlinks (feste Verknüpfung) zu einer Datei funktioniert mit dem Befehl D:\hardlink\mklink /H d:\Speicherort-und-Dateiname-Hardlink.txt D:\Original Quelldatei.txt
Auch ein Softlink (Symbolik Link) zu einer Datei funktioniert mit dem Befehl D:\hardlink\mklink /s d:\Speicherort-und-Dateiname-Hardlink.txt D:\Original Quelldatei.txt.
Daß immer die Originaldatei aufgerufen wird, habe ich mittels Textdatei überprüft.
Aufruf mittels Link und Text verändert, danach Aufruf vom Quellverzeichnis und den veränderten Text editiert. Danach wieder mittels Link aufgerufen und den veränderten Text gesehen.
Trotzdem habe ich Probleme
Programm Total Commander
Beim Symbolik Link wird eine Dateigröße von 0 angezeigt.
Beim Hardlink wird die Dateigröße der Originaldatei angezeigt. Es ist nirgends ersichtlich, daß dies nicht die Originaldatei, sondern ein Hardlink ist.
Der Windows Explorer
Beim Symlink wird als Dateityp Symlink und bei Dateigröße 0 angezeigt. Zusätzlich wird beim Symbolbild ein Verknüpfungspfeil angezeigt.
Beim Hardlink wird als Dateityp Textdokument und die Dateigröße der Originaldatei angezeigt. Es ist nirgends ersichtlich, daß dies nicht die Originaldatei, sondern ein Hardlink ist.
Der Command Prompt
Mit dem Befehl Dir wird beim Symlink als Dateiart Symlink und in eckiger Klammer der Pfad zur Originaldatei angezeigt.
Beim Hardlink wird wie bei einer normalen Datei die Dateigröße und Dateiname angezeigt.
In meiner Batchdatei ermittle ich die Attribute wie folgt
@echo off
for %%i in (%hardlink%) do set "attr=%%~ai"
echo %hardlink%
echo %attr%
Als Ausgabe erhalte ich für den Symlink --a-----l, (Archivbit und Link)
Als Ausgabe erhalte ich für den Hardlink --a------, (Archivbit) ---> Wieso wird hier kein Linkbit gesetzt?
Es ist mir aufgefallen, daß ohne Parameterangabe ein Verzeichnislink erstellt wird, und NICHT wie in der Direkthilfe angegeben eine Symbolische Verknüpfung für eine Datei.
Dafür muß der NICHT dokumentierte Parameter /S angegeben werden, um eine symbolische Verknüpfung für eine Datei zu erhalten.
Wo ist mein Denkfehler?
Wie kann ich mittels Batch ermitteln, ob die gewünschte Datei eine verlinkte Datei ist, oder eine einzelne eigene Datei.
Bitte um Hilfe
Danke im voraus
Gerry
Die Erstellung eines Hardlinks (feste Verknüpfung) zu einer Datei funktioniert mit dem Befehl D:\hardlink\mklink /H d:\Speicherort-und-Dateiname-Hardlink.txt D:\Original Quelldatei.txt
Auch ein Softlink (Symbolik Link) zu einer Datei funktioniert mit dem Befehl D:\hardlink\mklink /s d:\Speicherort-und-Dateiname-Hardlink.txt D:\Original Quelldatei.txt.
Daß immer die Originaldatei aufgerufen wird, habe ich mittels Textdatei überprüft.
Aufruf mittels Link und Text verändert, danach Aufruf vom Quellverzeichnis und den veränderten Text editiert. Danach wieder mittels Link aufgerufen und den veränderten Text gesehen.
Trotzdem habe ich Probleme
Programm Total Commander
Beim Symbolik Link wird eine Dateigröße von 0 angezeigt.
Beim Hardlink wird die Dateigröße der Originaldatei angezeigt. Es ist nirgends ersichtlich, daß dies nicht die Originaldatei, sondern ein Hardlink ist.
Der Windows Explorer
Beim Symlink wird als Dateityp Symlink und bei Dateigröße 0 angezeigt. Zusätzlich wird beim Symbolbild ein Verknüpfungspfeil angezeigt.
Beim Hardlink wird als Dateityp Textdokument und die Dateigröße der Originaldatei angezeigt. Es ist nirgends ersichtlich, daß dies nicht die Originaldatei, sondern ein Hardlink ist.
Der Command Prompt
Mit dem Befehl Dir wird beim Symlink als Dateiart Symlink und in eckiger Klammer der Pfad zur Originaldatei angezeigt.
Beim Hardlink wird wie bei einer normalen Datei die Dateigröße und Dateiname angezeigt.
In meiner Batchdatei ermittle ich die Attribute wie folgt
@echo off
for %%i in (%hardlink%) do set "attr=%%~ai"
echo %hardlink%
echo %attr%
Als Ausgabe erhalte ich für den Symlink --a-----l, (Archivbit und Link)
Als Ausgabe erhalte ich für den Hardlink --a------, (Archivbit) ---> Wieso wird hier kein Linkbit gesetzt?
Es ist mir aufgefallen, daß ohne Parameterangabe ein Verzeichnislink erstellt wird, und NICHT wie in der Direkthilfe angegeben eine Symbolische Verknüpfung für eine Datei.
Dafür muß der NICHT dokumentierte Parameter /S angegeben werden, um eine symbolische Verknüpfung für eine Datei zu erhalten.
Wo ist mein Denkfehler?
Wie kann ich mittels Batch ermitteln, ob die gewünschte Datei eine verlinkte Datei ist, oder eine einzelne eigene Datei.
Bitte um Hilfe
Danke im voraus
Gerry
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 1808101409
Url: https://administrator.de/contentid/1808101409
Ausgedruckt am: 18.11.2024 um 09:11 Uhr
2 Kommentare
Neuester Kommentar
Wo ist mein Denkfehler?
Als Ausgabe erhalte ich für den Hardlink --a------, (Archivbit) ---> Wieso wird hier kein Linkbit gesetzt?
Du hast das Prinzip von NTFS noch nicht verstanden.Als Ausgabe erhalte ich für den Hardlink --a------, (Archivbit) ---> Wieso wird hier kein Linkbit gesetzt?
Ein Hardlink ist nachdem er erstellt wurde in dem Sinne kein Link mehr weil es ein zusätzlicher Eintrag in der MFT ist der nur eben auf die gleichen Zielbits zeigt wie ein anderer MFT Eintrag.
Wenn du also wissen willst wie viele MFT Einträge es für eine Datei gibt dann
fsutil hardlink list <datename>
https://serverfault.com/questions/758496/get-hardlink-count-for-a-file-o ...
Auf NTFS-Volumes kann jede Datei über mehrere harte Links verfügen, sodass eine einzelne Datei in vielen Verzeichnissen (oder sogar im gleichen Verzeichnis mit unterschiedlichen Namen) angezeigt werden kann. Da alle Links auf dieselbe Datei verweisen, können Programme alle Links öffnen und die Datei ändern. Eine Datei wird erst aus dem Dateisystem gelöscht, nachdem alle Links zu ihr gelöscht wurden. Nachdem Sie einen hard-Link erstellt haben, können Programme ihn wie jeden anderen Dateinamen verwenden.
@echo off
set "file=E:\myfile.txt"
for /f "tokens=1 delims=:" %%a in ('fsutil hardlink list "%file%" ^| findstr /n .') do set cnt=%%a
if %cnt% GTR 1 (
echo File has %cnt% MFT references.
) else (
echo File is a single.
)