NTFS Hardlinks Verzweifelungsfrage

German support forum

Moderators: Hacker, Stefan2, white

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

Post by *konsortium »

Wenn das so weiter geht hier dann bekommen wir bald noch
3D Vektorgrafiken in einer Dos Box zu sehen :D
StatusQuo
Power Member
Power Member
Posts: 1524
Joined: 2007-01-17, 21:36 UTC
Location: Germany

Post by *StatusQuo »

HLScan_Hardlink Version 1.03 ist fertig zum Testen, damit sollten alle gefundenen Probleme behoben sein.

Erfolgreich getestet unter Win2k SP4 mit Dateinamen wie

Code: Select all

T:\Example\sdir  7  ,   .    ;   & äöüßÄÖÜß.ext äöüÄÖÜß\source  ,   .    ;   & äöüßÄÖÜß.ext äöüÄÖÜß
als Quelle und Ziel bei der Hardlink-Erstellung.

Download-Link und UUEncoded im ursprünglichen Posting,
Klartext habe ich wegen Überlänge nicht mehr hier eingestellt.

Aus dem Changelog in der readme.txt:
  • Fixed: geänderte Groß-/Kleinschreibung im Dateisystem wird jetzt ignoriert
    Fixed: Verarbeitung mehrfacher Leerzeichen ermöglicht
    Fixed: Verarbeitung von Sonderzeichen (',' / '&') ermöglicht
    Fixed: Verarbeitung von Umlauten ermöglicht (Codepage-Umschaltung)
    Changed: Anführungszeichen (") in hlscan.txt sind jetzt grundsätzlich verboten (normalerweise nicht vorhanden); vorhandene führen zum Abbruch der Batch.
[Edit: Update Download-Link=>indirekt]
Last edited by StatusQuo on 2007-11-16, 00:20 UTC, edited 2 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
Dalai
Power Member
Power Member
Posts: 10016
Joined: 2005-01-28, 22:17 UTC
Location: Meiningen (Südthüringen)

Post by *Dalai »

Ich musste erstmal durchsteigen und ausprobieren, um zu wissen, was du damit willst:

Code: Select all

@for %%e in ("%~1") do goto Start0
Wenn ein Parameter angegeben wird, dann gib ne Hilfe aus und beende das Skript.

Ich hätte das so gelöst:

Code: Select all

if not "%~1"=="" goto Start0
Mit der Prüfung auf die Existenz der reg.exe und chcp.com (übrigens ab Win2k immer im System vorhanden, die reg.exe gibt's im ResKit) machst du es dir aus meiner Sicht auch etwas kompliziert. Ich würde das so lösen:

Code: Select all

for %%i in (reg.exe chcp.com) do (
  if not exist "%SystemRoot%\system32\%%i" if not exist "%SystemRoot%\%%i" echo %%i nicht gefunden! && goto NoCpSwitch
)
Ist auch viel weniger zu schreiben. Zugegeben: Es wird keine Fehlermeldung ausgegeben, wenn die zwar existierende Datei nicht korrekt arbeitet, aber wann kommt das mal vor...



Prüfst du mit dieser Zeile den Inhalt der Variablen?

Code: Select all

for %%e in ("%cpActive%") do for %%f in ("%cpOEM%") do goto Start
Ich würde das so machen:

Code: Select all

if not "%cpOEM%"=="" if not "%cpActive%"=="" goto Start
Dann natürlich die Variablen am Anfang leer setzen.

Denn bedenke: for arbeitet ggf. mehrfach pro Klammerinhalt, if prüft immer nur einmal.

Übrigens gibt's für if auch ein else :wink:

Code: Select all

if "j"=="J" (echo blub) ELSE (echo blubsi)
Ansonsten: großartige Arbeit :!:

Eine Frage noch: Ist das Leerzeichen bei

Code: Select all

for /F "usebackq tokens=* delims= " %%e in (%fnHLScan%) do call :ParseLine "%%~e"
nach delims= im Abschnitt Start Absicht?

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 »

2Dalai
Ich hätte das so gelöst:

Code: Select all

if not "%~1"=="" goto Start0
Hätte ich bisher auch, hier habe ich solche Vergleiche aber absichtlich vermieden, wann immer es ging,
weil bei konsortium ein unerklärlicher Fehler bei bestimmtem Variableninhalt (Space? Anführungszeichen?) auftrat
(behoben in V1.02 durch Ersetzen von IF durch FOR).
die reg.exe gibt's im ResKit
Ja, steht auch in der readme.txt. Dachte ich mir, dass die keiner liest. ;)
Aber vielleicht hast Du ja eine frühe Version erwischt, das habe ich ziemlich zum Schluss herausgesucht und noch ins Archiv gesteckt...

Code: Select all

for %%i in (reg.exe chcp.com) do (
  if not exist "%SystemRoot%\system32\%%i" if not exist "%SystemRoot%\%%i" echo %%i nicht gefunden! && goto NoCpSwitch
)
Ist auch viel weniger zu schreiben. Zugegeben: Es wird keine Fehlermeldung ausgegeben, wenn die zwar existierende Datei nicht korrekt arbeitet, aber wann kommt das mal vor...
Würde bei mir z.B. nicht funktionieren, weil die reg.exe woanders liegt - die manuell von der CD entpackte ist in einem Tools-Verzeichnis gelandet, das auch im Suchpfad enthalten ist.
Prüfst du mit dieser Zeile den Inhalt der Variablen?

Code: Select all

for %%e in ("%cpActive%") do for %%f in ("%cpOEM%") do goto Start
Ich würde das so machen:

Code: Select all

if not "%cpOEM%"=="" if not "%cpActive%"=="" goto Start
Habe ich vermieden wegen des Fehlers bei konsortium, siehe erster Punkt.
Denn bedenke: for arbeitet ggf. mehrfach pro Klammerinhalt, if prüft immer nur einmal.
Naja, da bei der ersten Fundstelle der zweiten Variable eh abgebrochen wird und normalerweise beide aus einer einzelnen Zahl bestehen,
würde ich das nicht als so tragisch empfinden. ;)
Ansonsten: großartige Arbeit :!:
Danke, danke. Hoffentlich läuft's auch bei konsortium... :roll:
Eine Frage noch: Ist das Leerzeichen bei

Code: Select all

for /F "usebackq tokens=* delims= " %%e in (%fnHLScan%) do call :ParseLine "%%~e"
nach delims= im Abschnitt Start Absicht?
Ja, das trimmt noch ein paar Spaces weg, die es als Separator aussortiert.
Die erwünschten innerhalb der Namen bleiben dabei erhalten wegen "tokens=*".


P.S.: Danke für die Anregungen, ist immer interessant zu sehen, wie andere so mit Batch umgehen.
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 »

Würde bei mir z.B. nicht funktionieren, weil die reg.exe woanders liegt - die manuell von der CD entpackte ist in einem Tools-Verzeichnis gelandet, das auch im Suchpfad enthalten ist.
OK, aber es geht trotzdem einfacher :wink:

Code: Select all

for %%i in (reg.exe chcp.com) do (
  %%i /? > NUL 2> NUL
  if errorlevel 1 echo %%i nicht gefunden! & goto NoCpSwitch
)
Das /? könnte man sogar weglassen.

Ich arbeite allerdings grade an einer Lösung, wie man den Pfad durchsuchen kann. Mal sehn, ob das was wird...


EDIT: Unter Ausnutzung der Batch-Syntax (und dahingehend erweitert, dass eine Liste der fehlenden Dateien ausgegeben wird und dann erst ans Ende gesprungen wird) könnte man das auch so machen:

Code: Select all

for %%i in (reg.exe chcp.com) do (
  %%i /? > NUL 2> NUL || echo %%i nicht gefunden! & set err=1
)
if not "%err%"=="" goto NoCpSwitch
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
User avatar
norfie²
Power Member
Power Member
Posts: 1040
Joined: 2006-02-10, 07:27 UTC

Post by *norfie² »

Ich arbeite allerdings grade an einer Lösung, wie man den Pfad durchsuchen kann. Mal sehn, ob das was wird...
Hilfe und Support wrote:%~$PATH:I Durchsucht die in der Umgebungsvariablen PATH aufgeführten Verzeichnisse und erweitert %I zu dem voll gekennzeichneten Namen der ersten Übereinstimmung. Wurde der Name der Umgebungsvariablen nicht festgelegt oder die Datei nicht gefunden, gibt der Parameter eine leere Zeichenfolge zurück.
Hilfe und Support wrote:%~dp$PATH:I Durchsucht die in der Umgebungsvariablen PATH aufgeführten Verzeichnisse und erweitert %I zu dem Laufwerkbuchstaben und Pfad der ersten Übereinstimmung.
Ansonsten ist es ja toll, dass Ihr Euch soviel Muehe gebt und wenn Ihr es als sportliche Herausforderung seht, ist alles ok. Nur, wie schon geschrieben, kann konsortiums Aufgabe mittels rsync als Einzeiler geloest werden.
Last edited by norfie² on 2007-11-15, 07:58 UTC, edited 1 time in total.
StatusQuo
Power Member
Power Member
Posts: 1524
Joined: 2007-01-17, 21:36 UTC
Location: Germany

Post by *StatusQuo »

2Dalai
Ich arbeite allerdings grade an einer Lösung, wie man den Pfad durchsuchen kann. Mal sehn, ob das was wird...
Für den Anfang:

Code: Select all

for %%e in (.;%path%) do if exist "%%~e\%~1" echo "%%~e\%~1" & rem goto :EOF
;)

[Edit:]
Zur Erklärung: dursucht neben dem Pfad auch das aktuelle Verzeichnis ('.');
mit "goto :EOF" endet die Suche nach der ersten Fundstelle, ohne werden auch die restlichen Fundstellen angezeigt.
Last edited by StatusQuo on 2007-11-15, 08:39 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!
User avatar
norfie²
Power Member
Power Member
Posts: 1040
Joined: 2006-02-10, 07:27 UTC

Post by *norfie² »

2StatusQuo
StatusQuo wrote:Ich konnte das noch nicht testen, weil rsync auf meinem Laufwerk einen Fehler meldet:
The source and destination cannot both be remote.
rsync error: syntax or usage error (code 1) at main.c(1068) [receiver=2.6.9]
Uni* kennt keine Laufwerksbuchstaben, weshalb Syntax fuer Quell- und Ziellaufwerk ein klein wenig anders ist:
Windows: C:\
CygWin: /cygwin/c/
und so weiter.
StatusQuo wrote:Für Kopien auf der gleichen Partition hab ich das auch schon mal benutzt - aber bist Du Dir wirklich sicher,
dass es Hardlinks auch auf eine andere Platte übertragen kann?
Ja. Wenn Du willst sogar via FTP (sofern es der FTP-Server auch unterstuetzt).
StatusQuo
Power Member
Power Member
Posts: 1524
Joined: 2007-01-17, 21:36 UTC
Location: Germany

Post by *StatusQuo »

2norfie²
Nur, wie schon geschrieben, kann konsortiums Aufgabe mit rsync mit einem Einzeiler geloest werden.
Ich konnte das noch nicht testen, weil rsync auf meinem Laufwerk einen Fehler meldet
(Source + destination auf der gleichen lokalen Partition);
mit Dateimaske D:\dir\*.exe:
The source and destination cannot both be remote.
rsync error: syntax or usage error (code 1) at main.c(1068) [receiver=2.6.9]
Bzw. für zwei Verzeichnisangaben D:\dir bzw. d:\dir\:
rsync: Failed to exec ssh: No such file or directory (2)
rsync error: error in IPC code (code 14) at pipe.c(86) [receiver=2.6.9]
rsync: connection unexpectedly closed (0 bytes received so far) [receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(453) [receiver=2.6.9]
Für Kopien auf der gleichen Partition hab ich das schon mal benutzt - aber bist Du Dir wirklich sicher,
dass es Hardlinks auch auf eine andere Platte übertragen kann (wie von konsortium beabsichtigt)?

AFAIK: Bei Junctions mag das ja gehen, bei Hardlinks ist das schon schwieriger
(weder einer der Links, noch der Speicherplatz haben eine Information, wer noch alles auf die gleiche Position verweist,
nur die Anzahl der Links ist bekannt).

http://www.ghisler.ch/board/viewtopic.php?p=137759#137759
http://en.wikipedia.org/wiki/Hard_link (englisch, finde ich aussagekräftiger als die deutsche Variante dort)
http://de.wikipedia.org/wiki/Harter_Link
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 »

2norfie²
Windows: C:\
CygWin: /cygwin/c/
Ah, stimmt, da war mal was.

Möglicherweise ist die cygwin-Installation bei mir nicht mehr wirklich intakt:
Y:>rsync "/cygwin/y/tmp/__test24 spacepath/" "/cygwin/y/tmp/__test24 spacepath2/"
rsync: link_stat "/cygwin/y/tmp/__test24 spacepath/." failed: No such file or directory (2)
rsync: mkdir "/cygwin/y/tmp/__test24 spacepath2" failed: No such file or directory (2)
rsync error: error in file IO (code 11) at main.c(529) [receiver=2.6.9]
rsync: connection unexpectedly closed (8 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(453) [sender=2.6.9]

Y:>rsync "/cygwin/y/tmp/__test24 spacepath" "/cygwin/y/tmp/__test24 spacepath2"
rsync: link_stat "/cygwin/y/tmp/__test24 spacepath" failed: No such file or directory (2)
rsync: push_dir#3 "/cygwin/y/tmp" failed: No such file or directory (2)
rsync error: errors selecting input/output files, dirs (code 3) at main.c(565) [receiver=2.6.9]
rsync: connection unexpectedly closed (8 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(453) [sender=2.6.9]

Y:>rsync "/cygwin/y/tmp/__test24 spacepath/reg.exe" "/cygwin/y/tmp/__test24 spacepath2/reg.exe"
rsync: link_stat "/cygwin/y/tmp/__test24 spacepath/reg.exe" failed: No such file or directory (2)
rsync: push_dir#3 "/cygwin/y/tmp/__test24 spacepath2" failed: No such file or directory (2)
rsync error: errors selecting input/output files, dirs (code 3) at main.c(565) [receiver=2.6.9]
rsync: connection unexpectedly closed (8 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(453) [sender=2.6.9]
Ja. Wenn Du willst sogar via FTP (sofern es der FTP-Server auch unterstuetzt).
Die Betonung lag auf Hardlinks. Naja, wenn ich wieder etwas Zeit habe, lese ich mich da nochmal ein (rsync)...
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
Einstein hatte Unrecht. :D Die Antwort auf Dein 9:20 geschriebenes Posting wurde 9:17 verfasst. :D :D :D
Die Betonung lag auf Hardlinks
Ja, auch Hardlinks.

Code: Select all

rsync -auH /cygdrive/c/TEMP/test /cygdrive/d/TEMP
StatusQuo
Power Member
Power Member
Posts: 1524
Joined: 2007-01-17, 21:36 UTC
Location: Germany

Post by *StatusQuo »

2norfie²
Ist eben alles relativ. :D
rsync -auH /cygdrive/c/TEMP/test /cygdrive/d/TEMP
Hurra, mit /cygdrive/ (statt /cygwin/ wie oben) funktioniert das hier tatsächlich - inklusive Hardlinks.

Bin schwer beeindruckt. Uni* rules - wenn man es beherrscht. Dafür ist die Batch-Lösung spektakulärer. ;)
Beispiel ist notiert, vielen Dank.

Bei Gelegenheit werfe ich dann mal einen Blick in den Sourcecode (Google: rsync source code),
bin neugierig, wie die das angestellt haben...
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 »

StatusQuo wrote:2norfie²
Windows: C:\
CygWin: /cygwin/c/
Ah, stimmt, da war mal was.
Wenn du wissen möchtest, wie die Pfade zu deinen Laufwerken unter Cygwin gemappt sind, brauchst du nur mount eingeben. Die Pfade können je nach Installation verschieden sein! Man kann das auch ändern.

Normalerweise sind die Angaben der Pfade unter Cygwin transparent (egal ob Win oder *nix). Da rsync selber aber eine Shell (ssh) benutzt, müssen die Pfade *nix-like sein.
#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 »

@StatusQuo
Ich werde es heute abend testen sobald ich zuhause bin

Ich möchte mich nochmals sehr herzlich bedanken
daß du Dir soviel Mühe gemacht hast um mein Problem
zu lösen.

Auch wenn es mit rsync und cygwin mit dem von Norfie2
beschriebenen 1 Zeiler geht werde ich die "spektakuläre"
Version einsetzen.

@Norfie2
Wahrscheinlich hätte das Unix Geraffel dann auf meiner
Seit wieder tausend Fragen aufgeworfen die allesamt
nix mit der Problematik als solches zu tun gehabt
hätten.

Dazu kommt noch daß ich ggf mit der StatusQuo
Variante noch ein paar andere Dinge machen kann.

Ein wenig programmieren kann ich auch aber halt nur
gescheit in Power Basic. Damit kann ich z.b passend
zu meinem Datenbestand ein Tool schreiben welches
eine HLScan.txt kompatible Datei nach meinen Wünschen
erzeugt. Gerade die Dateioperationen mit langen Dateinamen
sind für mich aber problematisch gewesen.

Mit dem Script von StatusQuo ist aber auch das nun
kein Problem mehr. Damit kann ich jede noch so abstruse
Verzeichnis Struktur mit variabler Linkanzahl aufbauen
rekonstruieren, ändern.

und mit 0 Byte Dateien testet es sich auch viel schneller
als mit den Orignalen.

Ich bin sowas von begeistert ....
User avatar
Dalai
Power Member
Power Member
Posts: 10016
Joined: 2005-01-28, 22:17 UTC
Location: Meiningen (Südthüringen)

Post by *Dalai »

Gut, hier meine Lösung zum Durchsuchen des Pfads (danke an norfie² für den Tip mit der Env-Var):

Code: Select all

set err=
for %%K in (reg.exe chcp.com) do (
    if not exist ".\%%K" if "%%~$PATH:K"=="" echo "%%K" nicht gefunden! & set err=1
)
if not "%err%"=="" goto NoCpSwitch
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
Post Reply