cyberdevil0815
Goto Top

Batchdatei, welche von einem Netzwerkpfad die genaue Zeichenanzahl ausgibt

Batch, welcher eine Pfadtiefe je Zeile ermittelt und den Wert hinter den Pfad schreibt

Hallo zusammen,

bei meinen Backup ist mir aufgefallen, dass nicht mehr alle Dateien gesichert werden. Nun möchte ich ein Batchskript schreiben, welches für einen Netzwerpfad einen vordefinierten Ordner ausliest, anhand des Kriteriums "abPfadLängeX" (Beispiel 200 Zeichen) und die gefundenen Pfade in eine Datei schreibt, erzeugen.

Mein bisheriger Batch sieht so aus, hier werden an einem Bestimmten Ordner (G:\Projekte) die Verzeichnisse, als auch Unterverzeichnisse ausgegeben und in einen Datei weggespeichert. Wenn es die Datei schon gibt, wird die vorherige Log Datei gelöscht und eine neue erzeugt. Soweit so gut, nun soll das Skript um die Pfadtiefe erweitert werden.

Wie macht man das sinnvollerweise?

@echo off & setlocal
if exist C:\Pfadtiefe\summary.txt del C:\Pfadtiefe\summary.txt
for %%i in (g:\projekte\) do (
	pushd "%%i"  
	for /f "delims=" %%a in ('dir /l /n /s /b ') do echo \%%a >>C:\Pfadtiefe\summary.txt  
	popd

Content-Key: 175887

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

Printed on: April 19, 2024 at 11:04 o'clock

Member: colinardo
colinardo Nov 07, 2011 at 14:13:08 (UTC)
Goto Top
erstelle dir ein VBS-Script mit folgendem Inhalt, und speichere z.B. als check_chars.vbs
dim quelle,ziel,anzahl_zeichen
quelle = Wscript.Arguments(0)
anzahl_zeichen = 200
set objFS = Wscript.CreateObject("Scripting.FileSystemObject")  
set sumfile = objFS.OpenTextFile(quelle, 1)
while not sumfile.AtEndOfStream
	line = sumfile.ReadLine
	if len(line) > anzahl_zeichen then
		wscript.echo line
	end if
wend
sumfile.close()
dann fügst du ans Ende deiner Batch folgende Zeile ein:
cscript //nologo check_chars.vbs [PFAD ZUR SUMMARY.TXT]
Als Ergebnis erscheinen die Zeilen mit mehr als 200 Zeichen in der Shell. Die Ausgabe kannst du dann an in eine Datei leiten...
Member: cyberdevil0815
cyberdevil0815 Nov 07, 2011 at 14:21:42 (UTC)
Goto Top
@softmeister, erst einmal vielen Dank, mit *.vba hab ich noch weniger Plan als mit Batch auf DOS Ebene.

Hast Du hierfür auch eine Lösung?!
Member: colinardo
colinardo Nov 07, 2011 at 15:46:28 (UTC)
Goto Top
Du musst noch hinter 'setlocal' enabledelayedexpansion hinzufügen.
Den Teil zwischen :loop und goto :eof kannst du ans Ende deiner Batch stellen. Dieser Teil fungiert quasi als function der mit %%a als Parameter aufgerufen wird. Die Performance des Scripts ist hiermit jedoch nicht so gut, da jeder Buchstabe eines Pfades gezählt wird. Die Pfade die länger als 200 Zeichen sind werden in die Datei "output.txt" geschrieben.
@echo off & setlocal enabledelayedexpansion
for /f "delims=" %%a in ('dir /l /n /s /b ') do (call :loop "%%a")  

:loop
set /a Nr=0
set pfad=%1
set pfad=%pfad:~1,-1%
:start
set "char=!pfad:~%Nr%,1!"  
if "%char%"=="" goto :ende  
set /a Nr+=1
goto :start
:ende
if %Nr% GTR 200 (echo %pfad% >>output.txt)
goto :eof

Grüße Uwe
Member: Biber
Biber Nov 07, 2011 at 16:05:49 (UTC)
Goto Top
Moin cyberdevil,

vor einiger Zeit hatte ich mal in einem Tutorial ein paar Skizzen dazu gemacht.
Workshop Batch for Runaways - Part I - Beispiel FindLongPath.Bat Bedenklich lange Pfade finden.

Wahrscheinlich nicht ganz ohne Anpassungen verwendbar, aber hilft vielleicht.

Grüße
Biber
Member: bastla
bastla Nov 07, 2011 at 16:15:58 (UTC)
Goto Top
@softmeister
Wieso erstes und letztes Zeichen des Pfades eliminieren?

Etwas kürzer (und ohne "delayedExpansion") wäre übrigens:
set "char=%pfad%"  
:start
set /a Nr+=1
set "char=%char:~1%"  
if defined char goto :start
Dabei wird zwar von einer Mindestlänge von einem Zeichen ausgegangen, aber bei einem per "for" erstellten/übergebenen Variableninhalt für %pfad% nehme ich das Risiko ... face-wink

Grüße
bastla
Member: cyberdevil0815
cyberdevil0815 Nov 08, 2011 at 08:03:27 (UTC)
Goto Top
Guten morgen Administratoren - Forum,

ich habe meinen Code nun so stehen:

@echo off & setlocal
if exist C:\Pfadtiefe\summary.txt del C:\Pfadtiefe\summary.txt
for %%i in (c:\Dell) do (
	pushd "%%i"  
	for /f "delims=" %%a in ('dir /l /n /s /b ') do echo \%%a >>C:\Pfadtiefe\summary.txt  
	popd
)


for /f "delims=" %%i in ('dir /l /n /s /b ') do (call :loop "%%a")  

:loop
set "char=%pfad%"  
:start
set /a Nr+=1
set "char=%char:~1%"  
if defined char goto :start (echo %pfad% >> output.txt ) 

Resultat:
Ich erhalte eine Summary mit den entsprechenden Dateien bzw. Pfaden, was soweit in Ordnung ist (dient an dieser Stelle einem anderen Zweck).
Ich erhalte eine Output Datei, jedoch ohne irgendeinen Inhalt. Eigentlich sollte ich hier das gleiche sehen, wie in der Summary, jedoch mit der Zeichenlänge als Erweiterung.

By the way:
Das Tutorial habe ich mir durchgelesen, und wollte es für meine Zwecke modifizieren. Ergebnis präsentiere ich auch noch. Ich muss den Quellcode bzw. die Variablen noch verstehen bzw. korrekt zuordnen.
Member: colinardo
colinardo Nov 08, 2011 at 08:10:39 (UTC)
Goto Top
Der Mischmasch kann nicht funktionieren, Bau das Script so wie ich das oben geschrieben habe, das funktioniert 100% (getestet). Der Output meiner Version gibt aber nur die Zeilen aus, nicht die Länge des Pfades. Das lässt sich aber leicht ergänzen mit der Zeile
...
:ende
if %Nr% GTR 200 (echo %pfad% ## Length %Nr% >>output.txt)
goto :eof
Member: bastla
bastla Nov 08, 2011 at 08:22:58 (UTC)
Goto Top
Hallo cyberdevil0815!

Es fehlt (vor Zeile 14) ein
set /a Nr=0
und die Zeile 17 müsstest Du aufteilen in
if defined char goto :start
echo %pfad% >> output.txt
wobei die Zeile 2 durch Softmeisters Zeile 2 ersetzt werden sollte ...

Grüße
bastla
Member: cyberdevil0815
cyberdevil0815 Nov 09, 2011 at 09:16:55 (UTC)
Goto Top
Hallo zusammen,

an dieser Stelle vielen vielen Dank für Hilfe und Support.

Läuft alles wie gewünscht:

@echo off & setlocal
if exist C:\Pfadtiefe\summary.txt del C:\Pfadtiefe\summary.txt
for %%i in (D:\daten\Fs1\PROJEKTE\) do (
	pushd "%%i"  
	for /f "delims=" %%a in ('dir /l /n /s /b ') do echo \%%a >>C:\Pfadtiefe\summary.txt  
	popd
)

@echo off & setlocal enabledelayedexpansion
for /f "delims=" %%a in ('dir /l /n /s /b ') do (call :loop "%%a")  

:loop
set /a Nr=0
set pfad=%1
set pfad=%pfad:~1,-1%
:start
set "char=!pfad:~%Nr%,1!"  
if "%char%"=="" goto :ende  
set /a Nr+=1
goto :start
:ende
@echo off & setlocal
if %Nr% GTR 100 (echo %pfad% ## Length %Nr% >>output.txt) 
goto :eof