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
GELÖST

Batchdatei, welche von einem Netzwerkpfad die genaue Zeichenanzahl ausgibt

Frage Entwicklung Batch & Shell

Mitglied: cyberdevil0815

cyberdevil0815 (Level 1) - Jetzt verbinden

07.11.2011 um 14:22 Uhr, 3034 Aufrufe, 9 Kommentare

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?

01.
@echo off & setlocal 
02.
if exist C:\Pfadtiefe\summary.txt del C:\Pfadtiefe\summary.txt 
03.
for %%i in (g:\projekte\) do ( 
04.
	pushd "%%i" 
05.
	for /f "delims=" %%a in ('dir /l /n /s /b ') do echo \%%a >>C:\Pfadtiefe\summary.txt 
06.
	popd
Mitglied: colinardo
07.11.2011 um 15:13 Uhr
erstelle dir ein VBS-Script mit folgendem Inhalt, und speichere z.B. als check_chars.vbs
01.
dim quelle,ziel,anzahl_zeichen 
02.
quelle = Wscript.Arguments(0) 
03.
anzahl_zeichen = 200 
04.
set objFS = Wscript.CreateObject("Scripting.FileSystemObject") 
05.
set sumfile = objFS.OpenTextFile(quelle, 1) 
06.
while not sumfile.AtEndOfStream 
07.
	line = sumfile.ReadLine 
08.
	if len(line) > anzahl_zeichen then 
09.
		wscript.echo line 
10.
	end if 
11.
wend 
12.
sumfile.close()
dann fügst du ans Ende deiner Batch folgende Zeile ein:
01.
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...
Bitte warten ..
Mitglied: cyberdevil0815
07.11.2011 um 15:21 Uhr
@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?!
Bitte warten ..
Mitglied: colinardo
07.11.2011 um 16:46 Uhr
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.
01.
@echo off & setlocal enabledelayedexpansion 
02.
for /f "delims=" %%a in ('dir /l /n /s /b ') do (call :loop "%%a") 
03.
 
04.
:loop 
05.
set /a Nr=0 
06.
set pfad=%1 
07.
set pfad=%pfad:~1,-1% 
08.
:start 
09.
set "char=!pfad:~%Nr%,1!" 
10.
if "%char%"=="" goto :ende 
11.
set /a Nr+=1 
12.
goto :start 
13.
:ende 
14.
if %Nr% GTR 200 (echo %pfad% >>output.txt) 
15.
goto :eof
Grüße Uwe
Bitte warten ..
Mitglied: Biber
07.11.2011 um 17:05 Uhr
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
Bitte warten ..
Mitglied: bastla
07.11.2011 um 17:15 Uhr
@Softmeister
Wieso erstes und letztes Zeichen des Pfades eliminieren?

Etwas kürzer (und ohne "delayedExpansion") wäre übrigens:
01.
set "char=%pfad%" 
02.
:start 
03.
set /a Nr+=1 
04.
set "char=%char:~1%" 
05.
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 ...

Grüße
bastla
Bitte warten ..
Mitglied: cyberdevil0815
08.11.2011 um 09:03 Uhr
Guten morgen Administratoren - Forum,

ich habe meinen Code nun so stehen:

01.
@echo off & setlocal 
02.
if exist C:\Pfadtiefe\summary.txt del C:\Pfadtiefe\summary.txt 
03.
for %%i in (c:\Dell) do ( 
04.
	pushd "%%i" 
05.
	for /f "delims=" %%a in ('dir /l /n /s /b ') do echo \%%a >>C:\Pfadtiefe\summary.txt 
06.
	popd 
07.
08.
 
09.
 
10.
for /f "delims=" %%i in ('dir /l /n /s /b ') do (call :loop "%%a") 
11.
 
12.
:loop 
13.
set "char=%pfad%" 
14.
:start 
15.
set /a Nr+=1 
16.
set "char=%char:~1%" 
17.
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.
Bitte warten ..
Mitglied: colinardo
08.11.2011 um 09:10 Uhr
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
01.
... 
02.
:ende 
03.
if %Nr% GTR 200 (echo %pfad% ## Length %Nr% >>output.txt) 
04.
goto :eof
Bitte warten ..
Mitglied: bastla
08.11.2011 um 09:22 Uhr
Hallo cyberdevil0815!

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

Grüße
bastla
Bitte warten ..
Mitglied: cyberdevil0815
09.11.2011 um 10:16 Uhr
Hallo zusammen,

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

Läuft alles wie gewünscht:

01.
@echo off & setlocal 
02.
if exist C:\Pfadtiefe\summary.txt del C:\Pfadtiefe\summary.txt 
03.
for %%i in (D:\daten\Fs1\PROJEKTE\) do ( 
04.
	pushd "%%i" 
05.
	for /f "delims=" %%a in ('dir /l /n /s /b ') do echo \%%a >>C:\Pfadtiefe\summary.txt 
06.
	popd 
07.
08.
 
09.
@echo off & setlocal enabledelayedexpansion 
10.
for /f "delims=" %%a in ('dir /l /n /s /b ') do (call :loop "%%a") 
11.
 
12.
:loop 
13.
set /a Nr=0 
14.
set pfad=%1 
15.
set pfad=%pfad:~1,-1% 
16.
:start 
17.
set "char=!pfad:~%Nr%,1!" 
18.
if "%char%"=="" goto :ende 
19.
set /a Nr+=1 
20.
goto :start 
21.
:ende 
22.
@echo off & setlocal 
23.
if %Nr% GTR 100 (echo %pfad% ## Length %Nr% >>output.txt)  
24.
goto :eof
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Batch & Shell
gelöst Mit Batchdatei Informationen auslesen und diese strukturiert in Excel ausgeben (9)

Frage von Flodsche zum Thema Batch & Shell ...

Batch & Shell
gelöst In Html-Datei per Batchdatei das Datum und die Uhrzeit eintragen (2)

Frage von Hakiegold zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (9)

Frage von JayyyH zum Thema Switche und Hubs ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...

Backup
Clients als Server missbrauchen? (9)

Frage von 1410640014 zum Thema Backup ...