NTFS Hardlinks Verzweifelungsfrage

German support forum

Moderators: Hacker, Stefan2, white

User avatar
norfie²
Power Member
Power Member
Posts: 1040
Joined: 2006-02-10, 07:27 UTC

Post by *norfie² »

2konsortium
Ich wünsche mir sofort mein gutes
altes PowerBasic zurück.
Wenn das so weitergeht buddel ich meinen alten Compiler aus der Diskettenschatulle
Funktioniert noch - aber mit dem Windows Script Host kannst Du mit Visual Basic Script sofort loslegen.
siehe
Startmenue/Hilfe und Support
Thema: "Übersicht über Windows Script Host"

Noch ein paar Hinweise:
Im Forum kann bei Copy&Paste aus Beitraege leider auch mit "code"-formatierte Texten etwas schiefgehen - hauptsaechlich veraenderte "whitespaces", Zeichen >127Bit-ASCII aber auch schon Zeilenumbrueche. Leider ist zudem das Verhalten teilweise vom verwendeten Browser abhaengig. Weshalb ich gern Quellcode mit WinRAR packe und UUE-encodiert in Foren ablege.

Zum Debuggen sieht bei mir die 1.Zeile immer so aus

Code: Select all

@ECHO OFF %DEBUG%
Zum Debuggen wird dann vorher mit einem

Code: Select all

set DEBUG=ON
eingeschaltet und mit

Code: Select all

set DEBUG=
ausgeschaltet.

Ein Sprung ans Ende kann mittlerweile so geschrieben werden

Code: Select all

goto :eof
Die Sprungmarke "eof" ist standardmaessig definiert und muss selbst nicht angelegt werden.

Unter W2k und WXP kann man sich mit
Startmenue/Hilfe und Support
und den Themen
"Übersicht über die Eingabeaufforderung"
"Befehlszeilenreferenz A-Z"
eigentlich alles sehr schnell anlesen, was so benoetigt wird.
Und damit man diese Themen sich
a) nicht merken
muss und
b) schnell wiederfindet
legt man sich diese innerhalb des "Hilfe- und Supportcenter" gleich als "Favoriten" ab.

2DoubleT
Manpages zu rsync:
Code:
-H, --hard-links preserve hard links
Wusste gar nicht, dass rsync auch Hardlinks kopiert.
Zum Ausprobieren von rsync muss man aber gar nicht das komplette Cygwin installieren sondern kann sich auch einfach ein kleines Zip von der c't herunterladen.
Der Artikel dazu
http://www.heise.de/software/download/rsyncbackup.vbs/39087

2konsortium
Probier mal rsnync aus - das sollte (voellig scriptfrei) die Loesung Deines Problems bringen koennen.
konsortium
Junior Member
Junior Member
Posts: 19
Joined: 2007-11-08, 14:28 UTC

Post by *konsortium »

Vielen Dank für die ganzen Tips und Links erstmal

@StatusQuo
Ich mach mal die Log Datei und versuche es per Email.
Meine Email stand in der readme.txt im hlscan.zip.

Der Austausch der cmd Datei via Email gezipt wäre
damit ggf einfacher.

Rsync .... Das ist das was ich hier im Thread mit der
Snapshot Backup Methode meinte. Es gibt etliche
Derivate davon. Der eine hat die CT Variante
um mehr wie 260 Zeichen erweitert ein anderer hat
glaube ich ein DeltaCopy draus gebaut.
Ich hatte es nicht als Option für meinen
Fall angesehen weil es die Links auf der gleichen
Partition sichert. Wen die Platte aussteigt nützen mir
da auch 100 Snapshots nichts mehr.

Allerdings könnte das Script von StatusQuo auch hier
helfen. Dann könnte man sowohl Rsync als auch das Hlscan
Backup machen.
DoubleT
Member
Member
Posts: 163
Joined: 2003-11-22, 02:21 UTC
Location: Germany

Post by *DoubleT »

konsortium wrote:Rsync .... Ich hatte es nicht als Option für meinen
Fall angesehen weil es die Links auf der gleichen
Partition sichert. Wen die Platte aussteigt nützen mir
da auch 100 Snapshots nichts mehr.
Ich bin jetzt nicht ganz sicher ob es bei dir angekommen ist :) , aber...
Mit rsync kann man Sicherungen partitionsübergreifend und sogar remote jeglicher Art erledigen.

@norfie²
Den Vorschlag mit Cygwin als Ganzes habe ich nur gemacht, weil man damit alles beisammen hat. Ich dachte dabei auch an die Erzeugung/Umbenennung der Links. Es lässt sich mit einer Shell einfach besser Scripten.
#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 »

> Ich bin jetzt nicht ganz sicher ob es bei dir angekommen ist , aber...

Nee, bisher noch nicht ... Jetzt aber ;)

und über das komfortablere Scripten denke ich wie gesagt
bei der nächsten Problemstellung mal nach.

Vieleicht liegt hier nur ein Fehler durch Copy & Paste vor
der mit einem Zip Austausch via Email gar nicht erst passiert
wäre. Nun hat StatusQuo sich schon soviel Mühe gemacht
das ich seine tolle CMD auch gerne nutzen möchte.

Ich find es auch schon interessant wieviel man mit Batch
Programmierung erreichen kann.
konsortium
Junior Member
Junior Member
Posts: 19
Joined: 2007-11-08, 14:28 UTC

Post by *konsortium »

@Status Quo
Ich habe dir eine Email geschickt mit dem Log in ein Textfile
Es sieht folgendermaßen aus ...

Code: Select all

C:\Programme\Resource Kit>rem @echo off  

C:\Programme\Resource Kit>rem HLScan_HardLink.cmd  V1.01  (C) StatusQuo 2007  

C:\Programme\Resource Kit>rem restore hardlinks that got lost during copying  

C:\Programme\Resource Kit>rem uses FSUtil.exe, HLScan.txt (from HLScan.exe)  

C:\Programme\Resource Kit>set sSource=  

C:\Programme\Resource Kit>set sTmpLine=  

C:\Programme\Resource Kit>for /F "usebackq delims=" %e in (hlscan.txt) do call :ParseLine %~e  

C:\Programme\Resource Kit>call :ParseLine Hard Links Report for \\ATHLON  

C:\Programme\Resource Kit>      if not ' '=='' for %f in ( ) do set sTmpLine="%~f Hard" 
Die Fehlermeldung "synthaktisch nicht anwendbar" erscheint
in der Dos Box hinter der " call: Parseline Hard Links Report ...."
Zeile. Danach springt er wohl noch in die letzte Zeile und
bricht dann ab.
User avatar
norfie²
Power Member
Power Member
Posts: 1040
Joined: 2006-02-10, 07:27 UTC

Post by *norfie² »

2konsortium
Da hatte ich mich wohl mehr als missverstaendlich ausgedrueckt. Der Verweis auf die c't war eigentlich nur um das Programm rsync.exe ohne Installation lauffaehig zu haben und NICHT um das dort entwickelte Backup unbedingt weiter zu nutzen.

Aber man kann es natuerlich auch nutzen und dahingehend modifizieren:
Es ist neben der Anpassung des Quell- und Zielpfades in
rsyncbackup.vbs in Function getRsyncCmd(dryRun)
folgende Zeile zu aendern
original

Code: Select all

cmd = wsh.ExpandEnvironmentStrings("%comspec%") & " /c rsync -av"
modifiziert

Code: Select all

cmd = wsh.ExpandEnvironmentStrings("%comspec%") & " /c rsync -aHv"
Die Wiederherstellung ist mit rsync.exe dann ein Einzeiler nach diesem Muster

Code: Select all

rsync -aH /cygdrive/c/TEMP/test /cygdrive/d/TEMP/
Das kopiert rekursiv alle Dateien aus c:\TEMP\test nach d:\TEMP mit Beibehaltung der Hardlinks.

2DoubleT
Wer in Uni* zu Hause ist, fuer den ist Cygwin sicherlich ein unverzichtbares Tool, aber Windows hat seine eigenen Sriptfaehigkeiten.
DoubleT
Member
Member
Posts: 163
Joined: 2003-11-22, 02:21 UTC
Location: Germany

Post by *DoubleT »

konsortium wrote:Nun hat StatusQuo sich schon soviel Mühe gemacht
das ich seine tolle CMD auch gerne nutzen möchte.
Ich wollte die Arbeit von StatusQuo auch gar nicht bemängeln :!:
Mit Batch-Dateien kann man schon nette Dinge machen.
#5576 Personal licence
#155652 Commercial licence

Planung bedeutet, den Zufall durch den Irrtum zu ersetzten.
StatusQuo
Power Member
Power Member
Posts: 1524
Joined: 2007-01-17, 21:36 UTC
Location: Germany

Post by *StatusQuo »

2norfie²

Code: Select all

@ECHO OFF %DEBUG%
Bei gesetzter Variable %debug% gibt echo so zusätzlich eine Zeile "OFF ON" aus -
noch " >nul" hinter die Befehlszeile, dann entfällt auch die:

Code: Select all

@ECHO OFF %DEBUG% >nul
Ein Sprung ans Ende kann mittlerweile so geschrieben werden
Code:
goto :eof
Die Sprungmarke "eof" ist standardmaessig definiert und muss selbst nicht angelegt werden.
Richtig. Ich bevorzuge allerdings die manuellen Marken, weil sich hier
bei Bedarf schnell Aufräum-Befehle zum Batch-Ende hinzufügen lassen.
Die Hauptroutine springt dazu beim Verlassen ein Stück vor das Ende
(zu eventuellen Aufräumarbeiten), die Unterroutinen verabschieden sich direkt.
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
EMail ist angekommen, danke.

Code: Select all

C:\Programme\Resource Kit>      if not ' '=='' for %f in ( ) do set sTmpLine="%~f Hard"
Hier besteht sTmpLine aus einem einzelnen Leerzeichen - das sollte eigentlich nicht vorkommen
und dürfte für die Meldung verantwortlich sein.

Reproduzieren konnte ich den Fehler bisher zwar nicht (trotz manueller Verunstaltung der hlscan.txt),
aber Version 1.02 sollte mit der Situation ohne Abbruch/Fehlermeldung umgehen können.
Dazu habe ich u.a. entsprechende IF-Leerstring-Prüfungen durch weitere FOR-Schleifen und Marken ersetzt.

So ist es zwar noch etwas schwerer lesbar, dafür aber robuster (hoffentlich auch bei Dir).


Download der neuen Version 1.02 als Archiv mit readme.txt,
UUEncoded und als Klartext im ursprünglichen Posting.
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
Es läuft fast perfekt.

Ich habe mit Robocopy zwei große Verzeichnis Strukturen
kopiert und auf dem Ziellaufwerk welches einen anderen
Laufwerksbuchstaben hat dann dort mit deinem Tool die
Links wieder aufgebaut. Hierzu mußte ich nur in der
HLscan.txt aus "H:\" ein "R:\" machen.

Es funktionierte astrein. Besondere Begeisterung kam
auf daß man sogar partiell , händisch gelöschte
Links wieder nachträglich aufbauen kann.

Ich habe bisher aber nur mit 0 Byte Länge getestet.

Leider habe ich dann doch noch ein Problem gefunden.
Bei den Musikvideos hat er von 533 nur 518 aufgebaut.
Bei den Filmen von 112 waren es 98.

Im Exlorer kann man anhand des Icons sehen ob es ein
Link oder eine normale Datei ist. Darüber war schnell
klar daß es sich um Sonderzeichen handelt.
Offensichtlich waren es "Ä,Ö,Ü,ß"

Damit konnte ich aber noch nicht alle fehlenden ermitteln.
Bei genauer Betrachtung fielen dann noch folgende Zeichen
auf "&" und ebenso ein Komma wird anscheinend nicht
verarbeitet.

Film Beispiele:
Ü -> Bridget Jones - Schokolade zum Frühstück (RTL2).avi
ß -> Der Weiße Hai (TCM).avi
Ö -> Mörderischer Vorsprung (ORF).avi

" " -> Inspector Clouseau - Der beste Mann bei Interpol (MGM).mpg
- hier hab ich am längsten gerätselt. Das ist ein Schreibfehler meinerseits
zwischen Interpol und (MGM) sind nicht nur ein sondern zwei Spaces
reingerutscht. Als mehr wie Space ist wohl nicht erlaubt.
Da muß ich besser drauf achten.

Musikvideos
"," -> 1997 Lisa Stansfield - Never, Never Gonna Give You Up.mpg
"&" -> Charles & Eddie - Would I Lie To You.mpg

Ich habe die Vermutung daß der FSUtil Befehl diese
Sequenzen schon anlegen könnte wenn er sie bekommen
würde aber der Parser ggf bei einer Existprüfung einen
Errorlevel bekommt. Genaueres hab ich aber noch nicht
gefunden. Wird da eine Filename Expand Funktion genutzt ?

Ich glaube auch daß das Script Groß und Kleinschreibung
beachtet. Beim widerherstellen von R:\Musikvideos\Source
ins "R:\Musikvideos\Archiv" Verzeichnis passierte
erstmal nichts. War ein paar Sekunden unterwegs aber ohne
Meldung. Wird wohl die hlscan abgearbeitet haben in der Zeit.
Wieder am Prompt angelangt war das Zielverzeichnis noch leer

Dann hab ich ins hlscan.txt geschaut und dort
stand klein "musikvideo". Hab das dann im Zielverzeichnis
auch klein geschrieben und dann hat das Script es
bis auf die Umlautproblematik wieder hergestellt.

Auch hier tippe ich darauf das die "Source" aufgrund der
gross/klein Schreibung einfach nur nicht gefunden wurde
und es deshalb erst gar nicht zum Aufruf von FSUtil kam.

Vieleicht ist da ein gemeinsamer Zusammenhang

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

Post by *StatusQuo »

2konsortium
Danke für die ausführliche Rückmeldung.
Besondere Begeisterung kam
auf daß man sogar partiell , händisch gelöschte
Links wieder nachträglich aufbauen kann.
Das funktioniert allerdings nur, wenn die gelöschte Datei nicht die jeweils erste
im entsprechenden Block der hlscan.txt war: die erste (existierende) Datei im Block wird als
Referenz benutzt - existiert sie nicht, wird sie ignoriert.

Die Umlaute werden von hlscan offenbar im Windows-Zeichensatz geschrieben,
auf der Kommandozeile wird aber der DOS-Zeichensatz verwendet. :(
Abhilfe schafft hier z.Zt. nur ein Editor (z.B. TextPad, Wordpad reicht auch):
hlscan.txt laden (als Textdokument), dann speichern (als Textdokument - MS-DOS-Format).
=> Das sollte auch automatisch gehen. Zur Konvertierung mit Steuerung über Kommandozeile
gibt's bestimmt fertige Tools. Google findet da einiges zu "text convert dos windows"

An Groß-/Kleinschreibung kann ich in Batch leider nichts ändern, das muss ggf. im Editor korrigiert werden.
Falls ein Server als Kopierziel z.B. alles in Kleinbuchstaben wandelt,
helfen da globale Funktionen in Texteditoren wie TextPad.
=> Ich schaue mal, ob sich das vermeiden lässt...

Die Sache mit den doppelten Leerzeichen ist ein Kompromiss.
Die Batch könnte die Dateinamen auch unverändert übernehmen, dann muss aber die automatische
Entfernung der führenden Leerzeichen mit ParseLine entfallen
(das ist dann vorab Handarbeit im Editor, oder es muss ein Spezialtool her).

'&' und ',' in Dateinamen - wer macht denn auch sowas... ;)
Ursache ist auch hier die Leerzeichen-Entfernung in ParseLinie.
=> Das zu verarbeiten müsste machbar sein, baue ich dann in die nächste Version mit ein.

Die Behandlung der Ausnahmen stehen auf meiner Todo-Liste,
bin bisher aber noch nicht zur Umsetzung gekommen.
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 »

Die Umlaute werden von hlscan offenbar im Windows-Zeichensatz geschrieben,
auf der Kommandozeile wird aber der DOS-Zeichensatz verwendet. Sad
Abhilfe schafft hier z.Zt. nur ein Editor (z.B. TextPad, Wordpad reicht auch):
hlscan.txt laden (als Textdokument), dann speichern (als Textdokument - MS-DOS-Format).
=> Das sollte auch automatisch gehen. Zur Konvertierung mit Steuerung über Kommandozeile
gibt's bestimmt fertige Tools. Google findet da einiges zu "text convert dos windows"
Dazu gibt's eine "einfache" Lösung: chcp auf der Konsole ausführen (oder in die Batch mit einbauen).

Benutzung geht dann so:

Code: Select all

for /f "skip=4 tokens=3" %%i in (
  'reg.exe query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage" /v "ACP"'
) do (
  set active_cp=%%i
)

for /f "skip=4 tokens=3" %%i in (
  'reg.exe query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage" /v "OEMCP"'
) do (
  set oem_cp=%%i
)

REM Codepage ändern auf "ASCII"
chcp %active_cp% > NUL

<hier dann der andere Kram>

REM Codepage wieder zurückändern auf "ANSI"
chcp %oem_cp% > NUL

set oem_cp=
set active_cp=
Groß- und Kleinschreibung ist im Windows egal, auch wenn NTFS prinzipiell eine Unterscheidung macht, das darüberliegende Windows tut es nicht.

Gegen & und ' in Dateinamen lässt sich evtl. etwas tun, man müsste sie mit ^ maskieren, aber wie das gehen könnte *schulterzuck*. Vielleicht kann man mit dem Linux-Befehl sed was machen, um ein & durch ^& zu ersetzen...

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
Dazu gibt's eine "einfache" Lösung: chcp auf der Konsole ausführen (oder in die Batch mit einbauen).
Teste ich mal, danke Dir.
Groß- und Kleinschreibung ist im Windows egal
Bei Vergleichen in Batchdateien leider nicht:

Code: Select all

if "j"=="J" echo OK
Gegen & und ' in Dateinamen lässt sich evtl. etwas tun
Da gehe ich davon aus, dass die von den FOR-Schleifen über den "delims"-Parameter als normale Zeichen behandelt werden können...
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 »

Bei Vergleichen in Batchdateien leider nicht:
Doch, wenn man

Code: Select all

if /i "j"=="J" echo blub
benutzt. Schalter /i ist wie bei find und findstr zum Ignorieren der Groß- und Kleinschreibung da.
Da gehe ich davon aus, dass die von den FOR-Schleifen über den "delims"-Parameter als normale Zeichen behandelt werden können...
Stimmt, wenn man

Code: Select all

for "delims=" %%i in ()...
benutzt, geht das.

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
Schalter /i ist wie bei find und findstr zum Ignorieren der Groß- und Kleinschreibung da.
Cool, dem Ziel wieder ein Stück näher, danke. :)
Who the hell is General Failure, and why is he reading my disk?
-- TC starter menu: Fast yet descriptive command access!
Post Reply