NTFS Hardlinks Verzweifelungsfrage

German support forum

Moderators: Hacker, Stefan2, white

StatusQuo
Power Member
Power Member
Posts: 1524
Joined: 2007-01-17, 21:36 UTC
Location: Germany

Post by *StatusQuo »

2konsortium

Unten meine Lösung für eine jeweils beliebige, variable Anzahl von Hardlinks.

Die jeweils erste Datei eines Blocks muss existieren, bei den restlichen Dateien und Verzeichnissen ist das egal -
eventuell vorhandene Dateien dürfen nur nicht schreibgeschützt oder gesperrt sein, weil sie sonst nicht ersetzt werden.
Um auch schreibgeschützte zu ersetzen: dem "del"-Befehl den Parameter /F hinzufügen (in der Zeile vor FSUtil).

Features: (siehe auch readme.txt im Archiv)
  • Vorhandene doppelte Dateien werden gelöscht und durch Hardlinks ersetzt
    (soweit in der Datei hlscan.txt entsprechend aufgelistet; außer der jeweils ersten pro Block).
  • Nicht vorhandene Dateien werden als Hardlink angelegt (außer der jeweils ersten pro Block).
  • Nicht vorhandene Verzeichnisse werden angelegt.
  • Programm-Rückmeldungen können auf Fehlermeldungen beschränkt und in Datei umgeleitet werden (HLScan_HardLink.log):
    Standardeinstellung lässt sich in der Batch ändern, alternativ Variablen vor dem Start auf der Kommandozeile setzen:
    • set boLogErrorsOnly=0
      set boLogToFile=0
      set boLogToDisplay=1
      set fnHLScan=hlscan.txt
      set fnHLLog=HLScan_HardLink.log
    Die Bildschirmausgabe lässt sich mit Standardmethoden umleiten, z.B.: HLScan_HardLink.cmd>ausgabe.log
Einschränkungen + Voraussetzungen: (siehe auch readme.txt im Archiv)
  • '%' in Dateinamen wird (noch) nicht unterstützt
  • Eingabedatei "hlscan.txt" muss im aktuellen Verzeichnis liegen.
  • Die jeweils erste Datei in einem Block dient als Quelle;
    nachfolgend angegebene, ggf. vorhandene Dateien werden gelöscht und durch einen Hardlink auf die erste Datei im Block ersetzt.
  • Jede Zeile, die keine Pfadangabe ist, wird als Trennzeile interpretiert.
  • In der Datei hlscan.txt kommen normalerweise keine doppelten Anführungszeichen vor.
    Es dürfen auch manuell keine hinzugefügt werden, sonst droht vorzeitiger Abbruch der Batch.
  • Zur Ermittlung der benötigten Codeseiten wird ab V1.03 REG.EXE benötigt.
    Die ist bei WinXP standardmäßig dabei, bei Win2k muss sie erst aus der SUPPORT.CAB der
    Installations-CD zu Win2k entpackt werden. Wem die Datei fehlt, der findet über Google den Download über
    Suchbegriff "reg.exe download"
[Edits:] (siehe auch readme.txt im Archiv)
- V1.01: Verarbeitung der führenden Leerzeichen in hlscan.txt hinzugefügt.
- V1.02: Stabilitätsverbesserung (auf bestimmten Rechnern Problem mit bestimmten Leerzeichen)
- V1.03: Sonderzeichen, mehrfache Leerzeichen, Umlaute, Groß-/Kleinschreibung
- V1.04: Ausgabeumleitungen und -filter hinzugefügt

HLScan_HardLink.cmd (getestet unter Win2k SP4; Benutzung auf eigene Gefahr): UUEncoded (statt Klartext, gegen Probleme beim Kopieren aus dem Browser):

Code: Select all

begin 644 _HLScan_HardLink_104.rar
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
5VQ9H]I`,I<H,V/BR-G7$/7L`0`<`
`
end
sum -r/size 62335/4791
Ersten Testversuchen nach scheint es zu funktionieren
daß man quasi eine solche 3 x verlinkte Struktur
mit Verzeichnisbäumen und Leerdateien aufbauen kann.

Dann kopiert man einfach rüber, beantwortet die
"alle überschreiben" Frage mit ja und im Anschluß
sind automatisch auch alle Links aktualisiert.
Ja, wenn die bestehenden Dateien schon verlinkt sind, bleiben Links beim Überschreiben normalerweise erhalten
(solange man kein Programm mit exotischer Speichermethode darauf loslässt, wie z.B. MS *ffice).

Wenn Du aus Platzgründen zuerst die Struktur mit NullByte-Dateien kopierst, erstellt die Batch oben die Links dazu.
Danach noch die "echten" Dateien kopieren, fertig (hoffentlich ;) ).

Zur Analyse lässt sich die Ausgabe in eine Logdatei umleiten:

Code: Select all

HLScan_HardLink.cmd >HLScan_Hardlink.log 2>&1
Last edited by StatusQuo on 2007-11-18, 04:00 UTC, edited 9 times in total.
Who the hell is General Failure, and why is he reading my disk?
-- TC starter menu: Fast yet descriptive command access!
User avatar
norfie²
Power Member
Power Member
Posts: 1040
Joined: 2006-02-10, 07:27 UTC

Post by *norfie² »

2StatusQuo
Du warst aber schnell. :D
BTW: Hat es einen speziellen Grund, warum Du Deine Zeilen mit einem (C) versiehst?

Fuer alle, die dies nutzen wollen der Link zum Hlsan:
nur HLSCAN (ca.136KB): Resource Kit Web Package: Hlcan.exe
das gesamte RKT (ca. 12 MB): Windows Server 2003 Resource Kit Tools
konsortium
Junior Member
Junior Member
Posts: 19
Joined: 2007-11-08, 14:28 UTC

Post by *konsortium »

@StatusQuo
Uups, so schnell hatte ich gar nicht damit gerechnet.
Ich komme erst heute abend zum probieren
Vielen Dank schonmal vorab
StatusQuo
Power Member
Power Member
Posts: 1524
Joined: 2007-01-17, 21:36 UTC
Location: Germany

Post by *StatusQuo »

2norfie²
Du warst aber schnell. :D
Jo, hatte Spaß an der Herausforderung und wollte wissen, ob's lösbar ist... 8)
BTW: Hat es einen speziellen Grund, warum Du Deine Zeilen mit einem (C) versiehst?
Nö, macht damit, wozu ihr lustig seid. Bei einigen Projekten schreibe ich nur gern dazu, von wem's kommt - wer weiß, wozu es mal gut ist.
Who the hell is General Failure, and why is he reading my disk?
-- TC starter menu: Fast yet descriptive command access!
StatusQuo
Power Member
Power Member
Posts: 1524
Joined: 2007-01-17, 21:36 UTC
Location: Germany

Post by *StatusQuo »

2konsortium
Uups, so schnell hatte ich gar nicht damit gerechnet.
Ich auch nicht, aber als ich erst einmal mit Testen angefangen hatte... ;)
Who the hell is General Failure, and why is he reading my disk?
-- TC starter menu: Fast yet descriptive command access!
konsortium
Junior Member
Junior Member
Posts: 19
Joined: 2007-11-08, 14:28 UTC

Post by *konsortium »

@StatusQuo
Ich hab gerade mal an ein paar Testdateien kurz ausprobiert.

Die hlscan.txt steht im Verzeichnis vom ResourceKit
FSutil ist erreichbar

Nach dem Starten von deinem Script welches ich in
einen Texteditor geclipt und als hhl.cmd abgespeichert habe
bekomme ich am CMD Prompt die Meldung

-> "'==''" ist syntaktisch an dieser Stelle nicht verarbeitbar.

Ich habe XP Prof, SP2
Muß ich um Scripts abarbeiten lassen zu können irgendwas
installieren oder erst freigeben ?

gruß
konsortium
StatusQuo
Power Member
Power Member
Posts: 1524
Joined: 2007-01-17, 21:36 UTC
Location: Germany

Post by *StatusQuo »

2konsortium
Hm, knifflige Sache, sorry. :?

Als Schnelllösung hilft vermutlich, vor diese Zeile ein rem zu schreiben, um sie zu deaktivieren (zweite Zeile unter der Marke ":FoundTarget"):

Code: Select all

   if '%sSource%'=='"%~1"' goto ex
=>

Code: Select all

   rem if '%sSource%'=='"%~1"' goto ex
Das ist eine Sicherheitsprüfung, die einen Linkversuch einer Datei auf sich selbst verhindert (was die erste Datei löschen könnte). Wenn doppelte Einträge in der Liste nicht vorkommen (!), kann darauf verzichtet werden.

Ich komme erst morgen wieder an meine Rechner, dann sehe ich mir an, ob ich das reproduzieren kann.
Who the hell is General Failure, and why is he reading my disk?
-- TC starter menu: Fast yet descriptive command access!
DoubleT
Member
Member
Posts: 163
Joined: 2003-11-22, 02:21 UTC
Location: Germany

Post by *DoubleT »

konsortium wrote:Ich müßte jetzt irgendwie ne Scriptsprache
haben mit der ich das einfach realisieren könnte.
Mal so ins Blaue geschossen...

Wie wäre es, wenn du dir mit Cygwin eine *nix Umgebung unter Windows installieren würdest.

Dort hättest du:
  • eine Shell (sh) zum Ausführen von Scripten
  • ln zum Erzeugen von Links (symlink, hardlink)
  • rsync zum Sichern, incl. Links
  • cron für zeitgesteuerte Aufrufe von Scripten
unvm.

mal ein kurzer Auszug aus den Manpages zu rsync:

Code: Select all

-l, --links                 copy symlinks as symlinks
-L, --copy-links            transform symlink into referent file/dir
    --copy-unsafe-links     only "unsafe" symlinks are transformed
    --safe-links            ignore symlinks that point outside the tree
-k, --copy-dirlinks         transform symlink to dir into referent dir
-K, --keep-dirlinks         treat symlinked dir on receiver as dir
-H, --hard-links            preserve hard links
#5576 Personal licence
#155652 Commercial licence

Planung bedeutet, den Zufall durch den Irrtum zu ersetzten.
konsortium
Junior Member
Junior Member
Posts: 19
Joined: 2007-11-08, 14:28 UTC

Post by *konsortium »

@DoubleT
Sollte bei mir der Wunsch aufkommen irgendwann noch mehr
zu machen oder andere Spezialsachen zu realisieren dann
behalte ich dafür mal das Cygwin im Hinterkopf.

Aber nur für dieses Problem möchte ich damit nicht anfangen
zumal StatusQuo ja schon ne fertige Lösung hat.
Denke das Problem wird sich schon irgendwie lösen lassen.
Bei ihm gehts ja.

@StatusQuo
Ich habe deine Änderung mal gemacht aber die Fehlermeldung
bleibt. Habe dann mal woanders rumgeremt ;) und ein
paar Echos eingebaut.

Mir scheint er bleibt hier schon hängen.

:ParseLine
if not '%1'=='' ( <H I E R !!!!!!

Leider muß ich zugeben daß ich das Script und den Ablauf
nicht wirklich nachvollziehen kann. Dazu fehlt mir eine Beschreibung
der Synthax. Ist das ein normales Batch oder ist das schon
eine Windows Scriptsprache.

Hast du ggf einen Link zu einer Synthax erklärenden Seite.
Dann kann ich besser helfen und testen wenn ich es verstehe.

Beispiel:
> for /F "usebackq delims=" %%e in (hlscan.txt) do call :ParseLine %%~e

Ich vermute hier wird die Schleife für die Anzahl der Zeilen der
txt Datei durchlaufen und jeweils der Unterroutine Parseline
übergeben. Vorher werden vorne irgendwie noch die Spaces weggetrimmt. Aber quasi den Return Befehl erkenne ich nicht.
Am Ende von Parseline gehts dann nach ex, also raus ...

Ich habe der Batch auch keinen Parameter übergeben weil sie
ja selber nach der hlscan.txt im aktuellen Verzeichnis sucht.
User avatar
HolgerK
Power Member
Power Member
Posts: 5411
Joined: 2006-01-26, 22:15 UTC
Location: Europe, Aachen

Post by *HolgerK »

konsortium wrote:...
Hast du ggf einen Link zu einer Synthax erklärenden Seite.
...
- Kommando-Prompt (cmd) starten und folgendes eingeben:

Code: Select all

for /? >For_Syntax.txt
Da hat man für den Anfang erstmal genug Lektüre :)

HTH,
Holger
konsortium
Junior Member
Junior Member
Posts: 19
Joined: 2007-11-08, 14:28 UTC

Post by *konsortium »

@HolgerK
Danke. Boohr, wer hat sich bloss diesen %"~' Mist ausgedacht.
Kryptologie on the fly... Ich wünsche mir sofort mein gutes
altes PowerBasic zurück :cry:

Wenn das so weitergeht buddel ich meinen alten Compiler
aus der Diskettenschatulle 8)
User avatar
Dalai
Power Member
Power Member
Posts: 10016
Joined: 2005-01-28, 22:17 UTC
Location: Meiningen (Südthüringen)

Post by *Dalai »

Zu allererst: Respekt StatusQuo für dieses Skript! Ich bin zwar auch ein Skripting-Freak, aber sowas hätte ich nicht so leicht hinbekommen.

Code: Select all

rem echo :       FoundTarget: "%~1" & rem echo      sSource==%sSource% & rem echo.
Es sollte hier genügen, wenn man die Gleichheitszeichen maskiert, also so:

Code: Select all

rem echo :       FoundTarget: "%~1" & rem echo      sSource^=^=%sSource% & rem echo.
Dann sollte man diese Zeile wieder verwenden können.

Ich fände es auch besser, wenn man die if-Vergleiche nicht mit Anführungszeichen versieht sondern mit eckigen Klammern. Das hat den Vorteil, dass die Anführungszeichen nicht mit denen von Pfaden mit Leerzeichen kollidieren (denn die Tilde fügt ja auch noch welche hinzu). Bsp:

Code: Select all

for %%e in (%sTmpLine%) do if     "%%~dpnxe"=="%%~e" call :FoundSource "%%~e"
sollte ersetzt werden durch:

Code: Select all

for %%e in (%sTmpLine%) do if     [%%~dpnxe]==[%%~e] call :FoundSource "%%~e"
Ob das bei den Parametern für ein call des Abschnitts ebenfalls besser wäre, weiß ich nicht. Da aber im aufgerufenen Abschnitt um den Parameter %1 ebenfalls welche hinzugefügt werden (%~1), kann man sich die wohl auch sparen.

Die einfachen Anführungszeichen hier würde ich ebenfalls durch eckige Klammern ersetzen:

Code: Select all

:ParseLine
if not [%1]==[] (

Nur so ein paar Anregungen von mir. :wink:

Ach noch was: man braucht keine Echos einbauen, sondern man kann einfach das @echo off in der ersten Zeile auskommentieren (also rem @echo off), dann sieht man alles und auch, wo ein Fehler auftritt (ich geb zu, dass das viel Output sein kann *fg*).

Alternativ:

Code: Select all

if [%debug%]==[1] echo on
in die zweite Zeile schreiben und wenn man die Ausgabe haben will, schreibt man auf die Konsole einfach ein

Code: Select all

set debug=1
, bevor man das Skript laufen lässt.

MfG Dalai
#101164 Personal licence
Ryzen 5 2600, 16 GiB RAM, ASUS Prime X370-A, Win7 x64

Plugins: Services2, Startups, CertificateInfo, SignatureInfo, LineBreakInfo - Download-Mirror
StatusQuo
Power Member
Power Member
Posts: 1524
Joined: 2007-01-17, 21:36 UTC
Location: Germany

Post by *StatusQuo »

Dalai wrote:Zu allererst: Respekt StatusQuo für dieses Skript! Ich bin zwar auch ein Skripting-Freak, aber sowas hätte ich nicht so leicht hinbekommen.
Danke, danke.
Dalai wrote:

Code: Select all

rem echo :       FoundTarget: "%~1" & rem echo      sSource==%sSource% & rem echo.
Es sollte hier genügen, wenn man die Gleichheitszeichen maskiert, also so:

Code: Select all

rem echo :       FoundTarget: "%~1" & rem echo      sSource^=^=%sSource% & rem echo.
Dann sollte man diese Zeile wieder verwenden können.
Ähm, danke - aber die Zeile oben ist schon funktionsfähig, beim Beschränken auf das Wesentliche habe ich die Ausgabe allerdings ausgeblendet.
Ohne fand ich's übersichtlicher, ganz wegwerfen wollte ich die Zeile aber noch nicht, deshalb das rem. :)
Dalai wrote:Ich fände es auch besser, wenn man die if-Vergleiche nicht mit Anführungszeichen versieht sondern mit eckigen Klammern. Das hat den Vorteil, dass die Anführungszeichen nicht mit denen von Pfaden mit Leerzeichen kollidieren (denn die Tilde fügt ja auch noch welche hinzu).
Fast, gegen die Kollision benutze ich statt doppelter Anführungszeichen (") die einfachen ('), wo möglich. Anscheinend habe ich noch nicht alle Ausnahmefälle gefunden, die Fehlermeldung bei konsortium dürfte damit zusammenhängen...
Deine Version mit den Klammern [] sieht aber auch interessant aus.

Die Tilde fügt Anführungszeichen allerdings nicht hinzu, sondern entfernt eventuell vorhandene, danach können sie explizit wieder hinzugefügt werden:
FOR /? wrote: %~I - Expandiert %I und entfernt alle umschließenden
Anführungszeichen (").
Ergebnis ist, dass z.B. "langer Dateiname.txt" bei Verwendung von "%%~e" garantiert in Anführungszeichen steht, ggf. schon vorhandene aber vorher durch die Tilde entfernt werden (gegen die Kollision).
Dalai wrote:Bsp:

Code: Select all

for %%e in (%sTmpLine%) do if     "%%~dpnxe"=="%%~e" call :FoundSource "%%~e"
sollte ersetzt werden durch:

Code: Select all

for %%e in (%sTmpLine%) do if     [%%~dpnxe]==[%%~e] call :FoundSource "%%~e"
Das würde nicht funktionieren, wenn Leerzeichen enthalten sind. Versuche mal auf der Kommandozeile:

Code: Select all

if [test 123]==[test 123] echo OK
cmd.exe wrote:"123]==[test" ist syntaktisch an dieser Stelle nicht verarbeitbar.
Mit doppelten Anführungszeichen geht das:

Code: Select all

if "test 123"=="test 123" echo OK
Dalai wrote:

Code: Select all

if [%debug%]==[1] echo on
Nette Alternative, damit geht das Debuggen vielleicht flexibler.
Dalai wrote:Nur so ein paar Anregungen von mir. :wink:
Danke dafür.
Who the hell is General Failure, and why is he reading my disk?
-- TC starter menu: Fast yet descriptive command access!
User avatar
Dalai
Power Member
Power Member
Posts: 10016
Joined: 2005-01-28, 22:17 UTC
Location: Meiningen (Südthüringen)

Post by *Dalai »

Das würde nicht funktionieren, wenn Leerzeichen enthalten sind.
Ja, da hast du recht. Ich mache es immer so (sehe ich grade):

Code: Select all

 if "[%1]"=="[]" echo blub
also mit Anführungszeichen und eckigen Klammern, damit in jedem Fall etwas links und rechts des Vergleichs steht.


Sorry, ich dachte, die Tilde fügt Anführungszeichen hinzu...
Wie sagt man so schön: Wer lesen kann... :wink:


Debuggen kann man auch per Parameter:

Code: Select all

if "[%1]"=="[debug]" echo on
MfG Dalai
#101164 Personal licence
Ryzen 5 2600, 16 GiB RAM, ASUS Prime X370-A, Win7 x64

Plugins: Services2, Startups, CertificateInfo, SignatureInfo, LineBreakInfo - Download-Mirror
StatusQuo
Power Member
Power Member
Posts: 1524
Joined: 2007-01-17, 21:36 UTC
Location: Germany

Post by *StatusQuo »

2konsortium
Dalai wrote:Ach noch was: man braucht keine Echos einbauen, sondern man kann einfach das @echo off in der ersten Zeile auskommentieren (also rem @echo off), dann sieht man alles und auch, wo ein Fehler auftritt
Vielleicht kannst Du diese Änderung mal machen, die Ausgabe in eine Datei schreiben lassen und mir per Mail schicken?

Code: Select all

hhl.cmd>hhl.log
Der eMail-Link unter meinen Nachrichten hier im Board sollte funktionieren.

In einem Kurztest auf einem anderen Rechner mit XP Prof. SP2 läuft hier noch alles fehlerfrei (abgesehen davon, dass es auf dem kein NTFS gibt).
WARNUNG dazu: auf FAT-Laufwerken werden die Dupes gelöscht, es können aber (natürlich) keine Links angelegt werden; da baue ich noch eine Notfallfunktion ein, falls jemand das auf FAT-Laufwerken versucht. :)
[Edit: erledigt, Programmcode im ursprünglichen Posting ist aktualisiert]
Hast du ggf einen Link zu einer Synthax erklärenden
Seite.
Die meisten Befehle haben eine eingebaute Erklärung mit Parameter /?, wie HolgerK schon geschrieben hat.
Auch lesenswert:

Code: Select all

for /? >Syntax.txt
call /? >>Syntax.txt
if /? >>Syntax.txt
cmd /? >>Syntax.txt
Bei Wikipedia gibt's auch eine nette Seite dazu.
Aber quasi den Return Befehl erkenne ich nicht.
Am Ende von Parseline gehts dann nach ex, also raus ...
Genau - Beenden der Batch nach dem Call-Aufruf springt zum Befehl nach dem Call zurück:
CALL /? wrote: CALL :Marke Argumente

Mit den angegebenen Argumenten wird ein neuer Batchkontext erzeugt und
die Programmausführung hinter der angegebenen Marke fortgesetzt. Um die Batch-
datei dort tatsächlich zu verlassen, muss man sie zweimal beenden. Beim ersten
Erreichen des Endes wird das Programm zu dem Befehl hinter dem CALL-Aufruf
zurückkehren. Beim zweiten Mal wird dann die Batchdatei beendet.
Ist das ein normales Batch oder ist das schon
eine Windows Scriptsprache.
Ist "normales" Batch, mit den ab NT 4.0 dazugekommenen Erweiterungen.

Test kommt noch...
Last edited by StatusQuo on 2007-11-13, 03:23 UTC, edited 1 time in total.
Who the hell is General Failure, and why is he reading my disk?
-- TC starter menu: Fast yet descriptive command access!
Post Reply