zendara
Goto Top

Netzlaufwerk nach zu langen Pfaden durchsuchen

Hallo,

wir haben in der Firma mehrere Netzlaufwerke freigegeben wo unsere Mitarbeiter Ordner und Dateien anlegen können.
Jetzt stehe ich vor dem Problem, dass wir einen neuen Server bekommen haben und ich den ganzen Inhalt vom alten Server auf den neuen kopieren muss.

Leider funktioniert weder mit Windows kopieren und einfügen noch mit TotalCommander der Kopiervorgang richtig und es werden Dateien ausgelassen. Selbst wenn TotalCommander sagt, dass alle Dateien gleich sind kommt kommt beim Ordnervergleich der Eigenschaften ein anderes Ergebnis.

Das Problem meiner Ansicht nach sind zu lange Dateipfade die ich jetzt irgendwie rausfiltern will.
Ich habe aber keine Ahnung wie so eine Batchdatei aussehen soll.

@echo off
title Suche nach zu langen Dateipfaden
cd\
cls

echo -------------------------------------------------------------------
echo Netzlaufwerk auswählen
echo -------------------------------------------------------------------
echo    (1) Laufwerk P
echo    (2) Laufwerk Q
echo    (3) Laufwerk R
...
echo    (0) Exit
set /p _choice=Aktion waehlen:

if %_choice%==1 goto goto 1
if %_choice%==2 goto goto 2
if %_choice%==3 goto goto 3
...
if %_choice%==0 goto Exit

:Exit
exit

:1
set LW=P
goto Auswertung

:2
set LW=Q
goto Auswertung

:3
set LW=R
goto Auswertung

...

:Auswertung
Hier benötige ich einen Befehl der mir Laufwerk %LW% durchsucht und alle zb. Ordner die eine längere Struktur haben als zb. 240 Zeichen in eine Textdatei ausgibt.

pause

goto Exit


Hat jemand eine Idee was ich unter :Auswertung reinschreiben müsste um die Zeichenlänge der Ordnerstruktur auswerten zulassen?

Bin für jeden Tip dankbar

lg
Zendara

Content-ID: 203114

Url: https://administrator.de/contentid/203114

Ausgedruckt am: 08.11.2024 um 05:11 Uhr

DerWoWusste
DerWoWusste 11.03.2013 aktualisiert um 13:51:08 Uhr
Goto Top
Hi.

Ist es ein Datenbereich auf einer eigenen Partition? Dann mach es Dir einfach und zieh ein Image (falls Du einen Zwischenspeicher hast) oder klone, falls Du keinen ausreichend großen Zwischenspeicher hast.
Zendara
Zendara 11.03.2013 um 14:06:00 Uhr
Goto Top
Hallo es handelt sich um 2 Raidsysteme in 2 NAS Server. Ich würde gerne das Problem beim Schopf packen und die Langen Dateiändungen eliminieren.

Leider habe ich grad noch zusätzliche Probleme bekommen. Bin jetzt mit den meisten Netzlaufwerken fertig und der neue Server fängt zum piepen an weil eine Festplatte vom Raid defekt ist *schrei*
Hab zum Glück beim Kauf der NAS gleich eine zusätzliche HDD bestellt falls in weiter Zukunft mal eine Festplatte ausfällt. -.-
Jetzt mache ich grad eine Sicherung und in folge werde ich die Daten wieder auf die neue syncronisieren sobald ich sie getauscht habe.

Aber nochmal zurück zu deiner Antwort. Auf den beiden NAS System kann ich keinen Monitor anhängen um ein Image per zb. Bootstick zuziehen oder gibts da noch eine andere Möglichkeit?

lg
Zendara
DerWoWusste
DerWoWusste 11.03.2013 um 14:18:39 Uhr
Goto Top
Du sagst leider nichts darüber, wie das NAS angebunden ist. Wenn ISCSI, könntest Du problemlos ein Image ziehen, auch im laufenden Betrieb.
Lochkartenstanzer
Lochkartenstanzer 11.03.2013 um 15:02:25 Uhr
Goto Top
Zitat von @DerWoWusste:
Du sagst leider nichts darüber, wie das NAS angebunden ist. Wenn ISCSI, könntest Du problemlos ein Image ziehen, auch im
laufenden Betrieb.

Image im Laufenden Betrieb? Da sind fast immer Inkonsitenzen vorprogrammiert, es gibt nur wenige Filesysteme mit denen man sowas wagen kann und auch da muß man genau wissen was man tut. Sowas kann man nur machen, wenn das Filesystem wie einen snapshot-funktion hat, wie z.B. VSS unter windows bei NTFS.
Zendara
Zendara 11.03.2013 um 16:49:28 Uhr
Goto Top
Bei der alten NAS handelt es sich um einen Snap Server 4500 mit RAID 5 ohne ISCSI die neue ist eine Synology RS812.
Es wurden auch Netzlaufwerkfreigaben von anderen alten Linux und Windows Servern auf den neuen Server ausgelagert.

Mir geht es mit der Batch Datei aber um ein eigentlich für mich viel wichtigere Aufgabe.

1. Die langen Dateipfade zu ermitteln und zu korrigieren
2. Nach der Korrektur sollte ein fehlerfreier Zugriff auf die Daten der Netzlaufwerke möglich sein. Ohne mit irgendwelchen Trix die Daten zu syncronisieren.

Wenn die Pfade eine annehmbare Länge haben, ist ein fehlerfreies kopieren möglich. (hoffentlich face-smile )

Ich würde es gerne vermeiden die alte (fehlerhafte Struktur) auf den neuen Server per Image zu kopieren sondern zuerst etwas Ordnung in das Chaos bringen.

Als Beispiel welche Ordnerpfade bei uns so rumgeistern.

Q:\CERTIFICATES_HOMOLOGATIONS_Firma\Länderzuortnung\_ALLGEMEIN\_Allg. Schreiben, Briefe\Nutzung der erteilten Zulassungsanträge\DE_Zulassungsstelle_Antwort auf Schreiben__Nutzung der erteilten Zulassungsanträge für Kopierstationen.docx

Die meisten Pfade sind zum Glück in Ordnung aber bei manches Strukturen kommt dann sowas raus wie oben.

lg
Zendara
bastla
bastla 11.03.2013 um 18:59:26 Uhr
Goto Top
Zendara
Zendara 12.03.2013 um 17:00:53 Uhr
Goto Top
Hallo,

danke das ist genau das was ich suche! face-smile
Ich kann zwar mit den meisten Befehlen nichts anfangen, aber es funktioniert so ungefähr.

Morgen schau ich mir den Batch nochmal genauer an aber ich bin sehr zuversichtlich face-smile

Danke nochmal für den Link.

lg
Zendara
Zendara
Zendara 18.03.2013 um 09:12:56 Uhr
Goto Top
Ich hab mir jetzt einen Batch zusammengeschnipselt der mir die Pfade auflistet die nicht passen.
Jetzt besteht nur noch ein kleines Darstellungsproblem.

Bsp.
q:\ordner1\ordner2\ordner3\Datei1.txt

wenn jetzt die Dateilänge bis Ordner3 passt und nur der Name der Datei.txt zulange ist bekomme ich folgendes Ergebniss.

q:\ordner1
q:\ordner1\ordner2
q:\ordner1\ordner2\ordner3
q:\ordner1\ordner2\ordner3\Datei1.txt

Die Erstellte Datei die mir alle Pfade Auflistet beinhaltet jetzt über 4000 Zeilen mit der oben genannten Strucktur die leider recht unübersichtlich ist und ungeordnet.

Kann man sich nur die Zeile anzeigen lassen die wirklich über die von mir vorgegebene Zeichen länge geht?

@echo off
title Suche nach zu langen Dateipfaden
cd\
set lang=240

cls
echo -------------------------------------------------------------------
echo Netzlaufwerk auswählen
echo -------------------------------------------------------------------
echo.
echo Überprüft die Länge ab %lang% Zeichen
echo.
echo    (1) Laufwerk P
echo    (2) Laufwerk Q
echo    (3) Laufwerk R
echo    (0) Exit
echo.
set /p _choice=Aktion waehlen:

if %_choice%==1 goto Laufwerk_P
if %_choice%==2 goto Laufwerk_Q
if %_choice%==3 goto Laufwerk_R
if %_choice%==0 goto exit


:exit
exit

:Laufwerk_P
set LW=p:
goto Auswertung

:Laufwerk_Q
set LW=q:
goto Auswertung

:Laufwerk_R
set LW=r:
goto Auswertung


:Auswertung
::---------begin ofFindLongPath.bat -------
:: Aufruf FindLongPath [Lw:/Pfad] [Pfadlänge] -- Default Lw:/Pfad=%temp% -- Default Pfadlänge = 50
::@ECHO off & SETLOCAL ENABLEEXTENSIONS
SETLOCAL ENABLEEXTENSIONS
SET usedvars=tmpdatei reportdatei p1 p1masked p2 x YN PAUSE_D ECHO_D 
if Defined DebugMyBatches ((set ECHO_D=@ECHO) & (set PAUSE_D=pause) ) else ( set ECHO_D=REM)
REM call :Debugshow_vars "Am Start der Batchdatei" ...bei Bedarf das REM entfernen  
CALL :paramcheck %1 %2
:: Nicht einfach weiterlesen... hast Du geguckt, was in :paramcheck passiert???
DIR %p1% /aD /b /s >%tmpdatei%
IF exist "%reportdatei%" del "%reportdatei%"   
SET /a p2=%p2%-1
SETLOCAL EnableDelayedExpansion
FOR /F "delims=" %%i in (%tmpdatei%) do (set "x=%%i") && if "!x:~%p2%,10!" GTR "@" @echo %%i >>%reportdatei%  

IF EXIST "%reportdatei%" (  
     ECHO Report wurde gespeichert als %reportdatei%.   
     ECHO - Reportdatei vom %date% -- Alle Verzeichnisse ^>%p2% auf %p1% -->>"%reportdatei%"   
     ECHO - Reportdatei "%reportdatei%" -->>"%reportdatei%"  
     SET /p YN="Auf %p1% wurden Pfade mit Länge größer %p2% gefunden. Anzeigen (J/N?) "  
     IF /i "!YN!"=="J" TYPE "%reportdatei%" |MORE       
) ELSE (
     ECHO Keine Pfade länger als %p2% Zeichen im Pfad %p1% gefunden.
)
ENDLOCAL
CALL :DebugShow_vars
::CALL :cleanup
GOTO :eof
:: -------------------
::::::::::::  ParamCheck ... Hier werden die Parameter %1 und %2 geprüft daraus %p1% und %p2% abgeleitet.
:: Param 1 : Laufwerksbuchstabe oder Verzeichnis; Default %temp%
:::::::::::: Dieser Parameter wird als Substring in den Variablen %tmpdatei% und %reportdatei% verwendet 
:::::::::::: Dafür werden ":" und "\" durch "$" und"_" ersetzt, um einen gültigen Dateinamen zu bilden. 
:::::::::::: dazu Zwischenspeicherung in Variable %p1% und %p1masked% 
:::::::::::: Syntax dazu siehe SET /? und dort.. %PATH:str1=str2%
:: Param 2:: zu prüfende Länge der Verzeichnisse ... Default 50

:ParamCheck
IF (%1)==() (SET p1=%temp%) ELSE (SET p1=%1)
REM nächste Zeile bipede-Variante - siehe unten
IF (%1)==() (SET p1=%LW%) ELSE (SET p1=%1)
IF (%2)==() (SET /a p2=%lang%) ELSE (SET /a p2=%2)
SET p1masked=%p1::=$%
SET p1masked=%p1masked:\=_%
%ECHO_D% p1-^>p1masked ist %p1%-^>%p1masked%; p2 ist %p2%
::SET "tmpdatei=%temp%\%computername%_%p1masked%_All.lst" 
::SET "Reportdatei=%temp%\%computername%_%p1masked%_PfadeGTR%p2%.lst" 
SET "tmpdatei=e:\%computername%_%p1masked%_All.lst"  
SET "Reportdatei=e:\%computername%_%p1masked%_PfadeGTR%p2%.lst"  
CALL :Debugshow_vars "Nach Var-Setzen"  
goto :eof
:: --------------------
:DebugShow_vars
IF DEFINED DebugMyBatches (
SETLOCAL ENABLEDELAYEDEXPANSION
FOR %%i IN (%usedvars%) DO (ECHO [%~1] Variable %%i="!%%i!" )   
ENDLOCAL
PAUSE
)
GOTO :eof
:: -----------------
:cleanup
%ECHO_D% in Subroutine :Cleanup
::IF EXIST "%tmpdatei%" (del "%tmpdatei%") & %ECHO_D% Datei %tmpdatei% wird gelöscht. 
FOR %%i IN (%usedvars% usedvars) DO @IF DEFINED %%i (
  (IF DEFINED DebugMyBatches echo %%i wird freigegeben) & (SET %%i=))

GOTO :eof
::---------End of FindLongPath.bat -------


Danke lg
Zendata