dani
Goto Top

Batch - Backslash durch Slash ersetzen - Abfrage, ob der Ordner leer ist

Hallo @all,

ich schreibe monentan eine kl. Batchdatei um Dateien auf einen FTP-Server hochzuladen. Und zwar abhängig von lokalen Verzeichnisbaum. D.h. der FTP Server und die lokale Platte sind 1:1 gleich was die Struktur angeht.
D.h. die Dateien, die hochgeladen werden, müssen auf dem FTP-Server in das gleiche Verzeichnis wie lokal. An sich kein Problem, jedoch akzeptiert das FTP Command "cd" nur Slash's in Pfaden - was an sich ja nicht verkehrt ist. face-wink

Den Pfad habe ich bereits in einer Variablen und in dieser sollen nun alle Backslashes ("\") durch Slashes ("/") ersetzt werden. Ich habe es nochmal "bildlich" dargestellt:
c:\demos\addons\safquards\data\bin
daraus soll folgendes werden:
/demos/addons/safquards/data/bin
Ich hab mir schon diverse Schnipsel von Biber und bastla angeschaut, jedoch blick ich da nicht so ganz durch. face-confused face-wink


Gruss,
Dani

Content-Key: 103405

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

Printed on: April 26, 2024 at 15:04 o'clock

Member: bastla
bastla Dec 05, 2008 at 13:49:36 (UTC)
Goto Top
Hallo Dani!

Sollte so gehen:
@echo off & setlocal
set "P1=c:\demos\addons\safquards\data\bin"  
::Laufwerksanteil entfernen
for %%i in ("%P%") do set "P2=%%~pni"  
::Ersetzung vornehmen
set "P=%P2:\=/%"  
echo %P%
Grüße
bastla
Member: Dani
Dani Dec 05, 2008 at 15:16:48 (UTC)
Goto Top
Hi bastla,
ah...wenn ich meinen Code so anschaue, war ich gar nicht so weit weg von dir. Läuft auf jeden Fall 1A.
Einen Fehler hast du aber drinne: face-wink

Zeile 6 sollte so ausschauen:
for %%i in ("%P1%") do set "P2=%%~pni"  
Nachdem ich nebenher weiter programmiert habe, stellt sich mir noch ein Problem. Kann ich mit "If" prüfen, ob in einem Ordner Dateien vorhanden sind oder läuft das auf eine Schleife raus?!


Gruss,
Dani
Member: bastla
bastla Dec 05, 2008 at 15:29:55 (UTC)
Goto Top
Hallo Dani!

Einen Fehler hast du aber drinne: face-wink

Zeile 6 sollte so ausschauen:
Das kommt vom Verschlimmbessern beim Posten - ich wollte die "schöne" Variable %P% als Endergebnis, und habe daher das ursprüngliche P auf P1 geändert (allerdings in Zeile 4 face-wink) ...

Kann ich mit "If" prüfen, ob in einem Ordner Dateien vorhanden sind oder läuft das auf eine Schleife raus?!
Weder - noch. face-wink Ich würde das so machen:
dir "D:\Ordner" /a-d >nul 2>&1 && echo Dateien enthalten
Grüße
bastla
Member: Dani
Dani Dec 05, 2008 at 16:10:46 (UTC)
Goto Top
Hmm...irgendwo hab ich noch einen logischen Fehler drinne. So sieht mein Quellcode aus:
for /f "delims=" %%i in ('dir /b /ad /s /l "c:\programme"') do (  
		
		rem Laufwerksbuchstaben samt Doppelpunkt löschen und in neue Variable speichern
		set "path_tmp=%%~pi"  
		
		rem Backslash durch Slash ersetzen, da das FTP - Command "cd" nur mit Slash's geht  
		set "test=%path_tmp:\=/%"  
		
		rem Speichert das FTP - Kommando in die File
		echo cd "%test%"  
		echo cd %%i
Dann sieht die Ausgabe so aus:
cd "/programme/addons/datev/data/"  
cd c:\programme\addons
cd "/programme/addons/datev/data/"  
cd c:\programme\addons\datev
cd "/programme/addons/datev/data/"  
cd c:\programme\addons\datev\configs
cd "/programme/addons/datev/data/"  
cd c:\programme\addons\datev\data
cd "/programme/addons/datev/data/"  
cd c:\programme\addons\datev\plugins
cd "/programme/addons/datev/data/"  
cd c:\programme\addons\datev\data\lang
Wie man sieht, wiederholt sich alle 2 Zeilen ein Pfad. So sieht es aus, wenn ich "echo cd "%test%" auskommentiere:
cd c:\programme\addons
cd c:\programme\addons\datev
cd c:\programme\addons\datev\configs
cd c:\programme\addons\datev\data
cd c:\programme\addons\datev\plugins
cd c:\programme\addons\datev\data\lang
Diese Zeilen entsprechenden der wahren Verzeichnisstruktur. Irgendwo wird eine Variable nicht überschrieben...oder?


Grüße,
Dani
Member: bastla
bastla Dec 05, 2008 at 16:18:45 (UTC)
Goto Top
Hallo Dani!

DelayedExpansion ...

Alternative:
for /f "delims=" %%i in ('dir /b /ad /s /l "c:\programme"') do call :ProcessDir "%%i"  
goto :eof
		
:ProcessDir
rem Laufwerksbuchstaben samt Doppelpunkt löschen und in neue Variable speichern
set "path_tmp=%~p1"  
		
rem Backslash durch Slash ersetzen, da das FTP - Command "cd" nur mit Slash's geht  
set "test=%path_tmp:\=/%"  
		
rem Speichert das FTP - Kommando in die File
echo cd "%test%"  
echo cd %1
goto :eof
Grüße
bastla
Member: Dani
Dani Dec 05, 2008 at 18:36:33 (UTC)
Goto Top
G' Abend bastla,
ich habe dich nicht vergessen....nach Stundenlanger Nachdenken und Probieren, geht nun das Script 1A. Einiges ist sicher noch verbesserungswürdig aber das interessiert mich heute mal nicht mehr. face-wink Anbei mal den ganzen Schnipsel:
@echo off & setlocal EnableDelayedExpansion

set ftp_servers=F:\FTP-Tool\ftp_servers.txt


rem FTP-Daten auslesen
for /f "tokens=1,2,3 delims=;" %%a in ('type %ftp_servers%') do (  

	rem FTP Daten in die FTP-Auto-File schreiben
	echo open %%a>> "%temp%\ftp_upload_commands.txt"  
	echo %%b>> "%temp%\ftp_upload_commands.txt"  
	echo %%c>> "%temp%\ftp_upload_commands.txt"  

	rem Verzechnisse auslesen
	for /f "delims=" %%i in ('dir /b /ad /s /l "j:\programme"') do (  
		
		rem Laufwerksbuchstaben samt Doppelpunkt löschen und in neue Variable speichern
		set "linux_path=%%~pni"  
		
		rem Backslash durch Slash ersetzen, da das FTP - Command "cd" nur mit Slash's geht  
		 set "test=!linux_path:\=/!"  
		
		rem Speichert das FTP - Kommando in die File
		 echo cd !test!>> "%temp%\ftp_upload_commands.txt"  

		rem Ausgabe von allen Files die sich im jeweiligen Ordner liegenq
		dir "%%i" /a-d >nul 2>&1 && for /f "delims=" %%k in ('dir /b /a-d /l %%i') do echo mput "%%i\%%k">> "%temp%\ftp_upload_commands.txt"  
	)
	echo close >> "%temp%\ftp_upload_commands.txt"  
)
rem FTP Verbindung schließen
echo quit >> "%temp%\ftp_upload_commands.txt"  

rem Startet FTP Upload
ftp -d -i -s:"%temp%\ftp_upload_commands.txt"  

rem Löscht die FTP File
del "%temp%\ftp_upload_commands.txt"  


pause
An dieser Stelle nochmal vielen Dank für deine Einbringungen...


Grüße,
Dani