Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Workshop Batch for Runaways - Part I - Beispiel FindLongPath.Bat Bedenklich lange Pfade finden

Anleitung Entwicklung Batch & Shell

Mitglied: Biber

Biber (Level 5) - Jetzt verbinden

13.08.2005, aktualisiert 20.04.2011, 78269 Aufrufe, 24 Kommentare, 9 Danke

Ein paar Batchgrundlagen für Einsteiger und Fortgeschrittene..
Mit viel Prosa und einem bisschen Praxisbezug für den kleinen Admin und die kleine Admine

:intro
Ein kleiner Workshop für alle, die vielleicht mal einen Batch mit mehr mit 10 Zeilen schreiben wollen oder müssen...Ich will hier mal versuchen, einige der CMD-Möglichkeiten transparent zu machen, die besonders den "Absolute Beginners" immer so undurchsichtig bleiben. Und trotz alledem vielleicht ein oder zwei Batches hier posten, die auch in der Praxis genutzt werden können. Nur.. wo fang ich an??? Hmmm...okay,

IF "%meinName%"=="Hase" (goto AbsoluteBloodyBeginners) ELSE goto Angeber

:AbsoluteBloodyBeginners
Batch heißt "Stapel" und eine Batchdatei enthält also mehrere Befehle, im Normalfall einen pro Zeile, die nacheinander aufgeführt werden. Welche Befehle es gibt, ist bei Eingave von "help" am CMD-Prompt zu sehen. Eingeben kann man/frau das Ganze mit einem beliebigen Editor, speichert es als Datei mit der Endung *.bat, z.B. MeinErsterBatch.bat ab und ruft es auf durch Eingabe vom "MeinErsterBatch" vom CMD-Prompt.
Variablen kann man/frau auch definieren ("SET Nickname=Biber", sie ändern ("set Nickname=Der %Nickname% aus Bremen") und auch löschen ("set NickName=")
Und es gibt, wenn auch ein wenig spartanisch, ..na ja, nicht zumindest so ganz objektorientiert, alle nötigen Kontrollstrukturen wie
- IF ..ELSE-Verzweigungen,
- FOR..IN..DO-Schleifen und
- die Möglichkeit, Unterroutinen aufzurufen (mittels "call :subxy") oder
- mit einer "GOTO :sprungmarke"-Anweisung den Batch an einer anderen Programmzeile fortzusetzen.
-"Goto :eof" beendet eine Unterroutine oder auch das ganze Programm, entspricht also in etwa dem RETURN aus anderen Programmiersprachen.
- Kommentare und Doku-Zeilen kann ich auch einfügen (Zeilenbeginn mit "REM" oder "::")

Eine Trockenübung noch für die totalen Noobs und dann was Richtiges..
Mal einfach am CMD-Prompt eingeben:
01.
> Set meinNick=Biber 
02.
> Set meinPils=Becks 
03.
> Set derRest=Schweigen 
......(alle Inhalte können natürlich je nach Persönlichkeit geändert werden)

..spielen wir doch mal..."Set" zeigt alle Variablen, "Set mein" alle Variablen beginnend mit "mein"..
01.
> Set  
02.
> Set mein 
03.
> echo Mein Nick ist: %meinNick%, ich trinke %meinPils%. 
04.
> if defined meineRente (echo meine Rente ist %meineRente%) else echo MeineRente ist Undefiniert. 
05.
> FOR %i IN (meinNick meinPils meineRente derRest) DO @IF DEFINED %i SET %i
...wer bis hierhin klargekommen ist, der versteht auch den Rest.
Ach ja... das Zeichen "@" vor dem IF in der letzten Zeile unterdrückt nur die Anzeige dieses Befehls auf dem Bildschirm. Wird oft verwendet beim "@echo off" als erste Zeile in einer Batchdatei.


:Angeber
Nehmen wir mal lieber ein Beispiel aus dem Leben, ehe das zu trocken wird.. neulich gab es mal eine Herausforderung hier im Forum, die sich auch per Batch lösen läßt.. wir tasten uns mal laaangsam ran.

1) Die Aufgabe
Unter Pfadtiefe auslesen (von Kollege netboarder) steht:
"...Meine Aufgabe ist es einen Report zu erstellen in dem alle Verzeichnisse bzw. Pfade aufgelistet werden die eine Pfadtiefe > 200 Zeichen enthalten..." , eine Frage aus der Praxis, die sich nur auf drei Arten lösen lässt - mit Extra-Tools, durch Praktikanten oder eben mit den Windows-Bordmitteln, also Batch oder Script.
( weiterer Querverweis zu dem Thema Pfadlänge: Pfadtiefe unter verschiedenen Betriebssystemen)
Okay,...mal überlegen, bevor ich anfange, sollte ich am besten einen Plan haben.

2) Den Plan entwickeln .. oder: was weiß ich, was brauche ich und was sollte ich vorher überlegen?
"..einen Report erstellen..".. was will der? Ziel soll doch sein, alle Verzeichnisse mit Pfadlänge größer gleich nnn Zeichen in einer Text-Datei zu haben.. Daraus folgt doch, ich brate mir einen Batch zusammen, der soll heißen *grübel*... FindLongPath.bat, weil ich ja so gut ausländisch kann und der soll zwei Parameter haben, nämlich "Laufwerk/Pfad" und "Pfadlänge" und die nenne ich *grübelgrübelgrübel*.. ich nenne die p1 und p2
*strahl* und dieser Report soll heißen..am besten so, dass der Name etwas aussagt, also am Besten "f:_PfadeÜber200.txt", wenn nach Pfaden mit Länge größer 200 auf Laufwerk F: gefragt wird.., oder am besten noch den Computernamen dazu, wenn es ein Netzwerk ist.. also "Server0815_f:\_PfadeÜber200.txt" oder so... Hmm, da sind dann aber unerlaubte Zeichen drin.. na, aber sinngemäß geht das. Vielleicht "Server0815_f$_PfadeGTR200.txt" ..lieber auch keine Umlaute.
Dann kann er den aufrufen mit "FindLongPath F: 200" oder "FindLongPath d:\temp 50" zum Testen. und wenn er keinen Parameter eingibt, dann setze ich einen Default. Und wenn ich weiß, mit welchen Parametern ich etwas tun soll und wohin ich es schreibe.. dann suche ich also diese langen Pfade..
*grübel*
Ich suche Verzeichnisse auf Laufwerk X: mit einer bestimmten Pfadlänge, hmmmm.. das ist doch eine Untermenge ALLER Verzeichnisse auf Laufwerk X, und die prüfe ich dann auf ihre Länge ..wie bekomme ich denn alle Verzeichnisse? Ach ja.. das kann ich mit DIR abfackeln. Ich schreibe alle Verzeichnise in eine temporäre Textdatei und dann alle mit der großen Pfadlänge in diese endgültige Reportdatei.

Okay - zusammengefasst, ich habe
FindLongPath.bat (den Namen der Batchdatei) und als Parameter/Variablen
%1 (den Parameter "Laufwerk/Pfad") .... daraus leite ich mir meine Variable p1 ab
%2 (den Parameter "zu prüfende Länge")....daraus leite ich mir meine Variable p2 ab
Ich brauche als als Arbeitsvariablen p1, p2, Reportdatei, Tmpdatei
Die Namen der Reportdatei und der temporären Datei kann ich aus p1 und p2 ableiten.. los gehts.

Und ich will den Batch während der Entstehung "debuggen" können, denn der funktioniert bestimmt nicht beim ersten Mal. Dazu baue ich noch eine DebugShow_vars-Unterrotine ein. Und eine Cleanup-Routine auch. Der Batch besteht also aus den Unterroutinen "ParamCheck", "DebugShow_vars", "Cleanup" .. und einem Hauptteil hoffentlich. Let's go.
Wer diese "Debug-Features" nutzen will, muss VOR dem Aufruf des Batches eingeben
"Set DebugMyBatches=42"

3) Der Batch ...erster Wurf ( Version 0.01 Beta ) ->6.1.2007 0.03 Beta
01.
::---------begin ofFindLongPath.bat ------- 
02.
:: Aufruf FindLongPath [Lw:/Pfad] [Pfadlänge] -- Default Lw:/Pfad=%temp% -- Default Pfadlänge = 50 
03.
@ECHO off & SETLOCAL ENABLEEXTENSIONS 
04.
SET usedvars=tmpdatei reportdatei p1 p1masked p2 x YN PAUSE_D ECHO_D  
05.
if Defined DebugMyBatches ((set ECHO_D=@ECHO) & (set PAUSE_D=pause) ) else ( set ECHO_D=REM) 
06.
REM call :Debugshow_vars "Am Start der Batchdatei" ...bei Bedarf das REM entfernen 
07.
CALL :paramcheck %1 %2 
08.
:: Nicht einfach weiterlesen... hast Du geguckt, was in :paramcheck passiert??? 
09.
DIR %p1% /aD /b /s >%tmpdatei% 
10.
IF exist "%reportdatei%" del "%reportdatei%"  
11.
SET /a p2=%p2%-1 
12.
SETLOCAL EnableDelayedExpansion 
13.
FOR /F "delims=" %%i in (%tmpdatei%) do (set "x=%%i") && if "!x:~%p2%,10!" GTR "@" @echo %%i >>%reportdatei% 
14.
 
15.
IF EXIST "%reportdatei%" ( 
16.
     ECHO Report wurde gespeichert als %reportdatei%.    
17.
     ECHO - Reportdatei vom %date% -- Alle Verzeichnisse ^>%p2% auf %p1% -->>"%reportdatei%"  
18.
     ECHO - Reportdatei "%reportdatei%" -->>"%reportdatei%" 
19.
     SET /p YN="Auf %p1% wurden Pfade mit Länge größer %p2% gefunden. Anzeigen (J/N?) " 
20.
     IF /i "!YN!"=="J" TYPE "%reportdatei%" |MORE      
21.
) ELSE ( 
22.
     ECHO Keine Pfade länger als %p2% Zeichen im Pfad %p1% gefunden. 
23.
24.
ENDLOCAL 
25.
CALL :DebugShow_vars 
26.
CALL :cleanup 
27.
GOTO :eof 
28.
:: ------------------- 
29.
::::::::::::  ParamCheck ... Hier werden die Parameter %1 und %2 geprüft daraus %p1% und %p2% abgeleitet. 
30.
:: Param 1 : Laufwerksbuchstabe oder Verzeichnis; Default %temp% 
31.
:::::::::::: Dieser Parameter wird als Substring in den Variablen %tmpdatei% und %reportdatei% verwendet  
32.
:::::::::::: Dafür werden ":" und "\" durch "$" und"_" ersetzt, um einen gültigen Dateinamen zu bilden. 
33.
:::::::::::: dazu Zwischenspeicherung in Variable %p1% und %p1masked%  
34.
:::::::::::: Syntax dazu siehe SET /? und dort.. %PATH:str1=str2% 
35.
:: Param 2:: zu prüfende Länge der Verzeichnisse ... Default 50 
36.
 
37.
:ParamCheck 
38.
IF (%1)==() (SET p1=%temp%) ELSE (SET p1=%1) 
39.
REM nächste Zeile bipede-Variante - siehe unten 
40.
IF (%1)==() (SET p1=C:) ELSE (SET p1=%1) 
41.
IF (%2)==() (SET /a p2=50 ) ELSE (SET /a p2=%2) 
42.
SET p1masked=%p1::=$% 
43.
SET p1masked=%p1masked:\=_% 
44.
%ECHO_D% p1-^>p1masked ist %p1%-^>%p1masked%; p2 ist %p2% 
45.
SET "tmpdatei=%temp%\%computername%_%p1masked%_All.lst" 
46.
SET "Reportdatei=%temp%\%computername%_%p1masked%_PfadeGTR%p2%.lst" 
47.
CALL :Debugshow_vars "Nach Var-Setzen" 
48.
goto :eof 
49.
:: -------------------- 
50.
:DebugShow_vars 
51.
IF DEFINED DebugMyBatches ( 
52.
SETLOCAL ENABLEDELAYEDEXPANSION 
53.
FOR %%i IN (%usedvars%) DO (ECHO [%~1] Variable %%i="!%%i!" )  
54.
ENDLOCAL 
55.
PAUSE 
56.
57.
GOTO :eof 
58.
:: ----------------- 
59.
:cleanup 
60.
%ECHO_D% in Subroutine :Cleanup 
61.
IF EXIST "%tmpdatei%" (del "%tmpdatei%") & %ECHO_D% Datei %tmpdatei% wird gelöscht. 
62.
FOR %%i IN (%usedvars% usedvars) DO @IF DEFINED %%i ( 
63.
  (IF DEFINED DebugMyBatches echo %%i wird freigegeben) & (SET %%i=)) 
64.
 
65.
GOTO :eof 
66.
::---------End of FindLongPath.bat -------
-- Fortsetzung bei Interesse hier--
Workshop Batch for Runaways - Part II - Ein bisschen Handwerkszeug
Workshop Batch for Runaways - Part III - Datums- und Zeitvariablen im Batch
...und immer gern empfohlen
Tutorial zur FOR-Schleife von Friemler

Frank / der Biber aus Bremen
Mitglied: bipede
05.01.2007 um 14:15 Uhr
Hi,
ich wollte das Batch-Skript gerade verwenden. Um keine Parameter übergeben zu müssen habe ich einfach den Default-Wert für den Pfad zu "C:" geändert:
01.
------------------------------------ 
02.
:ParamCheck 
03.
IF (%1)==() (SET p1=C:) ELSE (SET p1=%1) 
04.
------------------------------------
Es klappt leider nicht, es heißt nur "Gerät ist nicht bereit". Das Spript habe ich vom Desktop aus gestartet (Doppelklick).

Irgendein Tipp? Ich verwende XP auf einem Samsung R40 Laptop.

Grüße
manu
Bitte warten ..
Mitglied: Biber
05.01.2007 um 15:07 Uhr
Moin bipede,

willkommen im Forum.
Ich habe noch einen Bugfix nachgezogen, der im Nachfolge-Tut "Workshop Batch for Runaways Part II - Ein bisschen Handwerkszeug" beschrieben wurde. Ich hatte mich damals nicht getraut, diesen Beitrag zu editieren, weil ein anderes meiner Tuts nach dem Editieren gar nicht mehr angezeigt wurde.

Ist jetzt oben eingebaut und nun sollte es laufen.

Okay, das sagen alle.
Wenn also nicht: Dann rufe das Skriptchen bitte über den CMD-Prompt auf und setze vorher
Set DebugMyBatches=wattDuWillst

Dann schauen wir weiter.

Grüße
Biber
Bitte warten ..
Mitglied: bipede
05.01.2007 um 15:34 Uhr
Hi, Danke. Die Reportdatei wird auf Laufwerk D gespeichert, das ist bei mir ein DVD-Laufwerk. Nachdem ich folgende Änderung vorgenommen habe

SET "Reportdatei=c:\%computername%_%p1masked%_PfadeGTR%p2%.lst"

klappt es. Die Reportdatei wird jetzt einfach im C-Laufwerk gespeichert.

Eher unwichtig:
Darf man denn die Endung in "txt" umändern?

Grüße und vielen Dank von der Dummie-Front
manu
Bitte warten ..
Mitglied: Biber
05.01.2007 um 15:43 Uhr
Na, dann bin ich beruhigt, bipede,

Eher unwichtig:
Darf man denn die Endung in "txt" umändern?
Klar, die Endung der Report-Datei ist hier vollkommen unwichtig.
Das einzige, was mit der gemacht wird, ist ein TYPE %reportdatei% .. und da ist die Endung beliebig.
Die Endung wäre nur dann von Belang, wenn Du die Datei über "Start %reportdatei%" mit der "richtigen" bzw. zugeordneten Applikation starten würdest... also eine .txt-Datei mit NotePad.exe öffnen oder eine Datei mit der Endung .HTML über den Explorer.

Grüße
Biber
[Edit] Einen Tag später....
Noch mal über den gemeldeten Bug nachgedacht und ...*vornKoppKlatsch* im Source stand tatsächlich:
SET "Reportdatei=d:\temp\%computername%_%p1masked%_PfadeGTR%p2%.lst"
-statt-
SET "Reportdatei=%temp%\%computername%_%p1masked%_PfadeGTR%p2%.lst"
D:\Temp entspricht auch tatsächlich meinem %temp%-Verzeichnis, aber bei anderen kann ja das Laufwerk D: auch ein CD-Laufwerk sein.
Na ja, nun ist es oben die Version 0.03.
Danke nochmal an bipede.
[/Edit]
Bitte warten ..
Mitglied: AD
12.02.2007 um 20:25 Uhr
Hallo Biber,

klasse Tutorial, habe auch ein "Big Problem", es wurde ausversehen in ein Verzeichnis mehere Unterverzeichnisse erstellt ohne weiteren Inhalt. Nun ist die Tiefe der Verzeichnisse schon so tief, dass die Größe von 256 Zeichen überschritten wurde. Hast du oder ein andere eine Idee wie ich diese Verzeichnisse gelöscht bekomme? Da es sich ja um Windows 2003 Server handelt ist es ja ab 256 Zeichen im Explorer vorbei, gibt es eine möglichkeit per script diese Verzeichnisse zu löschen (D:\public\Allgemein\Backup\Backup\Backup\Backup\Backup\Backup\Backup\Backup)?

Danke im Vorraus

Gruß Michael
Bitte warten ..
Mitglied: Biber
12.02.2007 um 21:03 Uhr
Moin AD,

im Explorer ist beim Anlegen und beim Hin-Kopieren bei 256 Zeilen Schluss, beim Lesen und beim Zurückkopieren bei 254..
Wenn Du zwischenzeitlich Programm aus der xxACLs-Schiene benutzt - die hauen bei 250 bis 253 Zeichen ins Mett...

Aber das löst Dein Problem ja nicht.

Also, wenn Du auf dem Server agieren kannst mit den nötigen Rechten, dann ist es einfach.
Rezept ist simpel: Den langen Pfad kürzer machen.
Zwei Strategien:
- > die simpelste: Mach ein Subst auf einen Teilpfad
Subst w: D:\public\Allgemein\Backup\Backup\Backup\Backup
rd /s /q w:\Backup

-> oder (wenn in den tieferen Ebenen noch Daten sein sollten)
Dann benenn die Teil-Unterordner per Batch oder von Hand um von "Backup" in "B".

Übrigens - in den grafischen Oberflächen entstehen interessante Effekte bei so langen Pfaden, gell? *g

Gruss
Biber
P.S. Wenn Du öfters Kommentare von mir liest, wirst Du merken, dass ich die Formulierung "Danke im Vorraus" total lieb habe....
Bitte warten ..
Mitglied: AD
12.02.2007 um 21:22 Uhr
Hallo Biber,

danke für deine schnelle Antwort. Ich werde es sofort probieren. Deine Vorliebe was die beiden Worte betreffen, habe ich in einen von mir vorher verfassten Kommentar eingebracht. Dieser ging mir aber leider wegen einer längeren Pause (meine kleine Tochter) verloren. m der zweiten Fassung habe ich Ihn dann irgendwie vergessen. Ich hoffe du kannst mir verzeihen.


Danke im Vorraus

Gruß AD
Bitte warten ..
Mitglied: TuXHunt3R
25.06.2007 um 12:29 Uhr
Guten Tag

1. Danke an den Biber für diesen Batch. Ich wollte schon lange so etwas realisieren und habe hier endlich einen Denkansatz gefunden.

2. Ich habe mir erlaubt, den Batch ein bisschen besser zu strukturieren und zu entschlacken. Da die Version von Biber fast gar nicht auskommentiert war, habe ich diese Ergänzungen vorgenommen

Hier meine Version des Batches:

01.
::***************************************************************** 
02.
::* LongPath.bat                                                   * 
03.
::* ===========                                                   * 
04.
::* Listet extrem lange Pfade                                     * 
05.
::* auf einem Laufwerk oder Share auf                             * 
06.
::* Herzlichen Dank an Biber (Forenmitglied bei administrator.de) * 
07.
::* History:                                                      * 
08.
::* 20.06.2007 - New Batch                              * 
09.
::* 25.06.2007 - Batch finalisiert                      * 
10.
::***************************************************************** 
11.
 
12.
@ECHO off 
13.
cls 
14.
 
15.
::----------------------------------------------------------------- 
16.
::Parameter-Abfragen 
17.
 
18.
if "%1"=="" goto manual 
19.
if "%1%"=="" goto Manual 
20.
if "%1%"=="?" goto Manual 
21.
if "%1%"=="/?" goto Manual 
22.
if "%1%"=="-?" goto Manual 
23.
if "%1%"=="-h" goto Manual 
24.
if "%1%"=="--h" goto Manual 
25.
if "%1%"=="-help" goto Manual 
26.
if "%1%"=="--help" goto Manual 
27.
if "%1%"=="help" goto Manual 
28.
 
29.
::Setze Variablen 
30.
SET usedvars=tmpdatei reportdatei p1 p1masked p2 x YN PAUSE_D ECHO_D  
31.
 
32.
set p1=%1 
33.
::Falls keine Längenangabe gemacht wird, wird die Länge auf 256 gesetzt 
34.
IF (%2)==() (SET /a p2=256 ) ELSE (SET /a p2=%2) 
35.
::Ersetze Zeichen, die nicht in Dateinamen dürfen (/\:*?"<>|) durch andere 
36.
SET p1masked=%p1::=$% 
37.
SET p1masked=%p1masked:\=_% 
38.
::%ECHO_D% p1-^>p1masked ist %p1%-^>%p1masked%; p2 ist %p2% 
39.
::Setze Variablen für die Logfiles 
40.
SET "tmpdatei=%systemroot%\temp\longpath\dir_%p1masked%.txt" 
41.
SET "Reportdatei=%systemroot%\temp\longpath\report_%p1masked%_Pfade-groesser-%p2%.lst" 
42.
::----------------------------------------------------------------- 
43.
 
44.
::----------------------------------------------------------------- 
45.
::Vorhergehende Aufgaben 
46.
 
47.
::Überprüeft, ob bereits ein Ordner für die Logfiles existiert 
48.
if exist %systemroot%\temp\longpath ( 
49.
rmdir /s /q %systemroot%\temp\longpath 
50.
51.
 
52.
::Erstelle Ordner für Logfiles 
53.
mkdir %systemroot%\temp\longpath 
54.
::----------------------------------------------------------------- 
55.
 
56.
::----------------------------------------------------------------- 
57.
echo Longpath.bat 
58.
echo ========== 
59.
echo. 
60.
::Überprüft, ob der angegebene Ordner existiert. Falls ja, listet der Batch alle Pfade auf 
61.
 
62.
If not exist %1 ( 
63.
echo Der Pfad %1 existiert nicht! 
64.
echo. 
65.
goto end 
66.
) else ( 
67.
echo Die Pfadlaengen-Abfrage von %1 wurde gestartet... 
68.
echo. 
69.
dir /s /b  %1 >>%tmpdatei% 
70.
echo Index wurde erstellt, Pfade werden gefiltert... 
71.
72.
::----------------------------------------------------------------- 
73.
 
74.
::----------------------------------------------------------------- 
75.
::Filtert das File %tmpdatei% nach langen Pfadnamen 
76.
SETLOCAL EnableDelayedExpansion 
77.
FOR /F "delims=" %%i in (%tmpdatei%) do (set "x=%%i") && if "!x:~%p2%,10!" GTR "@" @echo %%i >>%reportdatei% 
78.
 
79.
if exist %reportdatei% ( 
80.
echo. >>%reportdatei% 
81.
echo ---------------------------- >>%reportdatei% 
82.
echo Report des Batches "Longpath" >>%reportdatei% 
83.
echo ----------------------------- >>%reportdatei% 
84.
echo Ausgefuehrt am %date% von %username% >>%reportdatei% 
85.
echo Ordner: %p1% >>%reportdatei% 
86.
echo Gefilterte maximale Pfadlaenge: %p2% >>%reportdatei% 
87.
echo In %1 wurden Pfade mit Laenge groesser %p2% gefunden! 
88.
choice /c:JN Sollen die Ergebnisse in Notepad angezeigt werden? 
89.
if errorlevel 1 notepad %reportdatei% 
90.
) else ( 
91.
echo In %p1% wurden keine Pfade mit Laenge groesser %p2% gefunden! 
92.
echo. 
93.
94.
ENDLOCAL 
95.
::----------------------------------------------------------------- 
96.
 
97.
goto end 
98.
 
99.
 
100.
 
101.
:Manual 
102.
echo Longpath.bat 
103.
echo ========== 
104.
echo. 
105.
echo Listet alle Pfade auf, die laenger sind als die angegebene Laenge. 
106.
echo. 
107.
echo. 
108.
echo Starte Batch folgendermassen: 
109.
echo Fatpath Pfad Pfadlaenge 
110.
echo. 
111.
echo. 
112.
echo Beispiele: 
113.
echo Longpath \\server\share$\ordner1\ordner2 200 
114.
echo. 
115.
echo ==^> Listet alle Pfade in \\server\share$\ordner1\ordner2 auf, 
116.
echo      die laenger als 200 Zeichen sind. 
117.
echo. 
118.
echo Falls nicht angegeben wird, wie lange der Pfad sein darf, 
119.
echo geht Longpath davon aus, dass eine Pfadlaenge von 256 Zeichen gemeint ist. 
120.
echo. 
121.
echo Hier einige Angaben zu der maximal erlaubten Pfadlaenge von verschiedenen Dateitypen: 
122.
echo .doc --^>   
123.
echo .xls --^> 218 Zeichen 
124.
echo .ppt --^> 
125.
echo .pdf --^> 
126.
echo .pst --^> 
127.
echo.                            
128.
                                     
129.
:end 
130.
 
Bitte warten ..
Mitglied: Biber
28.06.2007 um 12:06 Uhr
Moin TuXHunt3R,

sorry, ich habe Deinen Kommentar eben erst entdeckt.

Erstmal danke für das Wiederbeleben des FindlongPath-Beispiels.

Und Recht hast Du... der war ja auch von mir eher ein bisschen verspielt und for educational purposes angelegt.
Und eigentlich nicht als wartbarer Produktivbatch.

Von daher finde ich Deine Variante sinnvoll und bedanke mich dafür.

Ändern/prüfen würde ich noch:

01.
.. 
02.
if "%1"=="" goto manual 
03.
if "%1%"=="" goto Manual 
04.
if "%1%"=="?" goto Manual 
05.
if "%1%"=="/?" goto Manual 
06.
if "%1%"=="-?" goto Manual 
07.
if "%1%"=="-h" goto Manual 
08.
if "%1%"=="--h" goto Manual 
09.
if "%1%"=="-help" goto Manual 
10.
if "%1%"=="--help" goto Manual 
11.
if "%1%"=="help" goto Manual
-> die ganzen Zeilen mit dem Prozentzeichen nach der "1" kämen auch ohne das letzte %-Zeichen aus.

Und das "goto end" und die Sprungmarke ":end" würde ich aus heutiger Sicht durch ein "goto :eof" (ohne Sprungmarke) ersetzen.

Viele Grüße
Biber
Bitte warten ..
Mitglied: TuXHunt3R
16.01.2008 um 20:33 Uhr
@ Biber

-> die ganzen Zeilen mit dem Prozentzeichen nach der "1" kämen auch ohne das letzte %-Zeichen aus.

Da hast du schon recht, es reicht auch ein %1

Und das "goto end" und die Sprungmarke ":end" würde ich aus heutiger Sicht durch ein "goto :eof" (ohne Sprungmarke) ersetzen.

Das goto :eof brauche ich eben häufig bei For-Schleifen, nach dem goto :end packe ich bei manchen Batchs noch ein kleines echo à la "echo Coded 2008 by TuXHunT3R" oder so was ähnliches hin. Ist mehr eine Stilfrage.
Bitte warten ..
Mitglied: 6741
10.02.2008 um 19:39 Uhr
hi

klasse Script Biber ...

könntest du eine Abfrage für einen Server einbauen ...???

Also:

Geben sie den Server an .. zb

\\10.10.10.10\d$

und dann sollte das Script die Freigabe absuchen ...

gruß
Bitte warten ..
Mitglied: TuXHunt3R
10.02.2008 um 23:20 Uhr
@6741


Schau dir mal meine Version sonst noch an. Es funktioniert auch mit UNC-Pfaden....
Bitte warten ..
Mitglied: 6741
11.02.2008 um 09:42 Uhr
Hi TuXHunt3R

ich habe das Script, so wie es ist, gestern getestet. Es blinket nur eine Dos Box auf, aber so passierte nichts. Muss man noch etwas berücksitigen? Wo stehtr der Pfad für die UNC Angabe, unter?

gruß
Bitte warten ..
Mitglied: TuXHunt3R
11.02.2008 um 20:08 Uhr
Du musst das Script aus der CMD-Konsole aus aufrufen. Wenn du es einfach doppelklickst, wird nur die Hilfe ausgegeben (und das auch nur für <1sek.)
Bitte warten ..
Mitglied: bipede
08.12.2008 um 22:35 Uhr
Hallo! Choise gibt es wohl unter XP nicht mehr - sonst ist das Skript hier klasse.

Beste Grüße
manu
Bitte warten ..
Mitglied: bipede
08.12.2008 um 22:37 Uhr
Hallo! Choise gibt es wohl unter XP nicht mehr - sonst ist das Skript hier klasse.

Beste Grüße
manu

PS: Sorry für den Doppel-Post - irgendwie ist der erste Kommentar viel zu weit oben.
Bitte warten ..
Mitglied: TuXHunt3R
11.12.2008 um 21:49 Uhr
Hallo bipede

Choice ist ein Exe-File, welches sich im XP-Resourcekit befinden sollte. Einfach mal googlen.
Bitte warten ..
Mitglied: bipede
11.12.2008 um 23:59 Uhr
Hallo und Danke - habe es mal runtergeladen.

Grüße!
manu

Nachtrag: Habe es installiert - aber unter C:\Programme\Support Tools gibt es choice.exe nicht - anyway - auf http://winsupport.org/utilities/freedos-choice.html gab es ne Freeware die wohl auch funktioniert.
Bitte warten ..
Mitglied: kleinerbub
17.01.2009 um 01:12 Uhr
Hi Biber,
danke für die Batch (ich weiß, is schon alt, aber aus aktuellem Anlass bin ich drüber gestolpert)!

Ich hätt mal noch ne Spezialfrage für die Profis unter den Batchern:

Ich hab n Skript, welches nacheinander Netzlaufwerke zu verschiedenen Servern verbindet und Verzeichnisse darüber sichert. Nun kam es vor, dass die maximale Pfadlänge überschritten wurde, wobei xcopy einfach abbricht (nebenbei such ich noch ne Möglichkeit diese Fehler zu loggen, weil man das sonst garnich gleich mitkriegt).

Jetz wärs cool, wenn ich vorher die Pfade auf Länge überprüfen lassen könnte und die zu langen Pfade in Kurzform (Option /N) kopieren lasse.

Wäre nett, wenn sich einer mit mir auf Lösungssuche begibt...


edit: Vielleicht mal noch ein Auszug aus meinem Sicherungsscript:
01.
if exist N:\nul net use /delete N: 
02.
 
03.
set param=/C /E /F /H /R /Y 
04.
set info=PW /user:User 
05.
set ID=1 
06.
 
07.
:Server1 
08.
set server=server1 
09.
set Verz1=\d$ 
10.
set Ziel1=BACKUP\server1 
11.
GOTO Server_Start 
12.
 
13.
:Server2 
14.
set server=server2 
15.
set Verz1=\d$ 
16.
set Verz2=\e$ 
17.
set Ziel1=BACKUP\server2_D 
18.
set Ziel2=BACKUP\server2_E 
19.
GOTO Server_Start 
20.
 
21.
:Server3 
22.
GOTO Complete 
23.
 
24.
:Server_Start 
25.
net use N: \\%server%%Verz1% %info% 
26.
IF NOT %errorlevel% == 0 ( 
27.
	echo Die Netzwerkverbindung zu %server%%Verz1% konnte nicht hergestellt werden.>> C:\DS\Logfiles\%logname%.log 
28.
) ELSE ( 
29.
	xcopy N:\*.* E:\%1\%Ziel1%\*.* %param% 
30.
	net use /delete N: 
31.
	IF NOT %errorlevel% == 0 echo Fehler beim Kopiervorgang.>> C:\DS\Logfiles\%logname%.log 
32.
33.
 
34.
IF not defined Verz2 ( 
35.
	GOTO Server_Done 
36.
) ELSE ( 
37.
	net use N: \\%server%%Verz2% %info% 
38.
	IF NOT %errorlevel% == 0 ( 
39.
		echo Die Netzwerkverbindung zu %server%%Verz2% konnte nicht hergestellt werden.>> C:\DS\Logfiles\%logname%.log 
40.
	) ELSE ( 
41.
		xcopy N:\*.* E:\%1\%Ziel2%\*.* %param% 
42.
		net use /delete N: 
43.
		IF NOT %errorlevel% == 0 echo Fehler beim Kopiervorgang.>> C:\DS\Logfiles\%logname%.log 
44.
45.
46.
 
47.
:Server_Done 
48.
set Verz1= 
49.
set Verz2= 
50.
set Ziel1= 
51.
set Ziel2= 
52.
set param=/C /E /F /H /R /Y 
53.
set /a ID=%ID%+1 
54.
GOTO Server%ID% 
55.
 
56.
 
57.
:Complete 
58.
if exist N:\nul net use /delete N:
Bitte warten ..
Mitglied: Biber
17.01.2009 um 14:34 Uhr
Moin kleinerbub,

danke für das Feedback.
Deine Fragen möchte ich ein bisschen anders beantworten, als Du vielleicht erhofft hast...

a) XCopy-Abbrüche und XCopy-Log...
Hmmja, gibt es laut XCopy-Hilfe alles, auch einen so genannten "restartable mode" und ein "mach weiter bei Fehlern"... aber:
  • eine oberflächliche Suche im Netz nach "xcopy Fehler" oder "xcopy bugs" liefert definitiv genug, um XCopy aus allen Mach-mir-ein-Serverbackup-Phantasien zu verbannen. Nimm Robocopy.exe (oder professionelleres).
Was Robustheit, Logging und Parametrisierbarkeit angeht hätte ich aber auch gegen RoboCopy keine Bedenken.

b) Pfade kürzen und als kurze Namen kopieren (/N-Option)
Never. No way. Was nützt Dir eine tägliche, stündliche oder atomzeitgenaue Serversicherung, bei der Dir Detailinfos wie Pfad- und Dateinamen verloren gehen? No no no...

c) falls Du nur zwei Minuten Aufwand investieren willst und "erstmal" bei XCopy bleiben möchtest, dann wäre meine Strategie und meine Empfehlung wie folgt:
  • im Moment liest Du die Quell-Pfade+Dateinamen von einem Laufwerk "N:\". Dort kannst Du alles lesen (keine zu langen Pfade etc)
  • im Moment kopierst Du in ein Zielverzeichnis "xcopy N:\*.* E:\%1\%Ziel1%\*.* , also ausführlich geschrieben ein Unterverzeichniszweig, der 20 oder 25 Zeichen länger ist als die Länge des Quellpfades (der ist ja "N:\")
  • also: Wenn Du einen Pfad kopierst, der exakt genauso lang ist wie der (problemlos lesbare) Quell-Pfad, dann ist doch kein Problem mehr zu erwarten.
  • Also mache folgendes: Suche Dir einen freien Lw-Buchstaben (meinetwegen Z: wie Ziel).
  • Und definiere das Zielverzeichnis mit SUBST.exe jeweils als logisches Laufwerk Z:.

Beispiel in Deinem Schnipsel:
01.
..... 
02.
:Server_Start  
03.
net use N: \\%server%%Verz1% %info%  
04.
 
05.
IF NOT %errorlevel% == 0 (  
06.
	echo Die Netzwerkverbindung zu %server%%Verz1% konnte nicht hergestellt werden.>> C:\DS\Logfiles\%logname%.log  
07.
) ELSE (  
08.
      REM Erstes Ziel-Verz trennen+neu zuordnen 
09.
      IF Exist Z:\ subst Z: /D  
10.
      Subst Z: "E:\%1\%Ziel1%" 
11.
      xcopy N:\*.* Z:\*.* %param%  
12.
.... 
13.
14.
 
15.
REM für %Verz2%, %VerzN% analog. Lw Z: trennen+neu zuordnen 
16.
..
Ein weiterer präventiver Schritt sollte allerdings sein, mit Skript und mit Deinen Endusern zusammen mal hin und wieder die "bedenklich langen Dateinamen" zu suchen - mit willkürlicher Max-Längen-Vorgabe von Dir. Und die gemeinsam auf kürzere Pfade/Namen zu bringen. Keine automatische Verstümmelung durch /N oder so was.

Grüße
Biber
Bitte warten ..
Mitglied: FrankD
20.07.2009 um 10:58 Uhr
Hallo zusammen,

ich bin auf diesen Thread gestoßen, da mich folgendes Problem zwickt:

Ich habe als NAS-Platte im Netzwerk eine Buffallo Linkstation Mini mit einem RAID1 Verbund aus zwei 500er Platten. Da gab's neulich Probleme, jedenfalls wollte ich an deren USB-Port eine 500er 2,5"-HDD anhängen und ein Backup machen. Das dauert ewig und Recherchen auf der Herstellersite ergaben, dass ab einer Pfadtiefe von 120 Zeichen es möglicherweise Probleme geben könne die eben genau zu diesem langsamen Backup führten.

So, jetzt suche ich ein Programm oder eine Batchdatei die mir die Anzahl der Zeichen im Pfad auswirft, denn auf der NAS habe ich - ordnungsliebend - natürlich verschachtelt und sortiert.

Mein Problem bei Euch: Ich verstehe nicht wirklich alles. Ich habe z.B. die sehr übersichtliche Batch von TuXHunt3R in den Editor kopiert und als zeichen.bat gespeichert. Die starte ich im CMD-Fenster und habe nun das Problem, wie ich den Pfad angeben soll.

Beispiel: Die Batch liegt bei mir auf D: - überprüfen will ich H: (eine USB-HDD), dann gebe ich ein "test \\h:" - das funktioniert nicht, will ich H:\Dateiablage überprüfen, so gebe ich ein "test \\h:\Dateiablage", auch hier meckert die Batch, dass der Pfad nicht existiert.

Auf der NAS, der ich per Netzlaufwerk den Laufwerksbuchstaben S: zugewiesen habe, dasselbe Problem.

Was mache ich verkehrt? Ich bin in DOS nicht mehr wirklich sattelfest.

Gruß,
Frank
Bitte warten ..
Mitglied: TuXHunt3R
20.07.2009 um 14:46 Uhr
Hallo Frank

Da hast du etwas falsch verstanden. Es gibt bei Windows grundsätzlich zwei Arten, wie Pfade angegeben werden können.

1.) Mit UNC-Pfaden für den Zugriff auf Netzwerkfreigaben: \\server\freigabe$
2.) Lokale Laufwerke, z.B. H:\Ordner1

In deinen Fall kannst du als Pfad einfach folgendes angeben, dann solte es funktionieren:
01.
H:\
Die ganze Zeile sähe dann bei dir folgendermassen aus:
01.
zeichen.bat H:\ 120
Bitte warten ..
Mitglied: FrankD
21.07.2009 um 14:08 Uhr
WOW! Vielen Dank, hat wunderbar geklappt!

Danke,
Frank
Bitte warten ..
Mitglied: nosa01
08.06.2010 um 11:26 Uhr
Danke, genau dieses Script habe ich gesucht

Gruß

Norbert
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Windows Tools
Suche Batch Scheduler (.bat .cmd .exe) (8)

Frage von hf1965 zum Thema Windows Tools ...

Batch & Shell
Dateinamen nach Zeichnen abschneiden - Batch-Shell (9)

Frage von cberndt zum Thema Batch & Shell ...

Batch & Shell
CMD Verschlüsslung ( Batch ) (9)

Frage von clragon zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Router & Routing
gelöst Ipv4 mieten (22)

Frage von homermg zum Thema Router & Routing ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...