Mit Batch-Datei auf Verzeichnis zugreifen - Ordnername nicht bekannt - FTP
Hallo,
ich habe folgendes Problem:
Ich möchte mit einer Batch Datei in ein bestimmtes Verzeichnis gehen z.B:
C:\Users\Lampux\Desktop\Eingang
Nun gibt es im Verzeichnis "Eingang" mehrer Ordner, die jeweils 5 Dateien enthalten.
Ich brauche nun die 5 Dateien der 5 Ordner. Jedoch weis ich nicht wie die Ordner heißen, der Ordnername ist unbekannt und kann auch immer anderst sein. Jedoch benötige ich nur die Ordner mit 9 stelliger Zahlenkomibinaton.
Aber falls das nicht umsetzbar ist, dann gehts natürlich auch, wenn ich alle Ordner nehme, die ich dann anschließend löschen werde.
So heißen die Ordner z.B:
123456789
Files45
Ordner3asdf
lode
kakaka
So in diesen 5 Order sind jeweils 5 Datenbank Dateien, und eig brächte ich nur die 5 Dateien von dem "123456789" Ordner (Dieser Ordner hat aber jedes mal eine andere Zahlenkomination), aber wenn ich alle bekomme ist auch nicht schlimm.
Diese Dateien möchte ich dann anschließend auf FTP hochladen, das passende FTP Script habe ich bereits, jedoch kann ich natürlich die Dateien nicht auswählen, da ich nicht weis, wie auf den unbekannten Ordner zugreifen soll.
set tempftp=%temp%\fileserver.ftp
:# ftp-skript erzeugen
echo OPEN server > %tempftp%
echo USER name pw >> %tempftp%
echo cd /public_html >> %tempftp%
echo send C:\Users\Lampux\Desktop\Eingang\???????????????????? >> %tempftp%
echo disconnect >> %tempftp%
echo quit >> %tempftp%
:# alles ausführen
ftp.exe -n -i -s:%tempftp%
del %tempftp%
pause
exit
Ich hoffe hier kennt sich jemand aus, und kann mir weiterhelfen, das wäre echt nett.
mfg Lampux
ich habe folgendes Problem:
Ich möchte mit einer Batch Datei in ein bestimmtes Verzeichnis gehen z.B:
C:\Users\Lampux\Desktop\Eingang
Nun gibt es im Verzeichnis "Eingang" mehrer Ordner, die jeweils 5 Dateien enthalten.
Ich brauche nun die 5 Dateien der 5 Ordner. Jedoch weis ich nicht wie die Ordner heißen, der Ordnername ist unbekannt und kann auch immer anderst sein. Jedoch benötige ich nur die Ordner mit 9 stelliger Zahlenkomibinaton.
Aber falls das nicht umsetzbar ist, dann gehts natürlich auch, wenn ich alle Ordner nehme, die ich dann anschließend löschen werde.
So heißen die Ordner z.B:
123456789
Files45
Ordner3asdf
lode
kakaka
So in diesen 5 Order sind jeweils 5 Datenbank Dateien, und eig brächte ich nur die 5 Dateien von dem "123456789" Ordner (Dieser Ordner hat aber jedes mal eine andere Zahlenkomination), aber wenn ich alle bekomme ist auch nicht schlimm.
Diese Dateien möchte ich dann anschließend auf FTP hochladen, das passende FTP Script habe ich bereits, jedoch kann ich natürlich die Dateien nicht auswählen, da ich nicht weis, wie auf den unbekannten Ordner zugreifen soll.
set tempftp=%temp%\fileserver.ftp
:# ftp-skript erzeugen
echo OPEN server > %tempftp%
echo USER name pw >> %tempftp%
echo cd /public_html >> %tempftp%
echo send C:\Users\Lampux\Desktop\Eingang\???????????????????? >> %tempftp%
echo disconnect >> %tempftp%
echo quit >> %tempftp%
:# alles ausführen
ftp.exe -n -i -s:%tempftp%
del %tempftp%
pause
exit
Ich hoffe hier kennt sich jemand aus, und kann mir weiterhelfen, das wäre echt nett.
mfg Lampux
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 135154
Url: https://administrator.de/contentid/135154
Ausgedruckt am: 05.11.2024 um 14:11 Uhr
22 Kommentare
Neuester Kommentar
Hallo Lampux und willkommen im Forum!
Etwa so:
Grüße
bastla
Etwa so:
@echo on & setlocal
set "Ordner=C:\Users\Lampux\Desktop\Eingang"
set "Name="
for /d %%i in ("%Ordner%\*.*") do call :ProcessDir "%%i"
if not defined Name echo Nicht gefunden & goto :eof
echo Ordnerpfad: %Name%
goto :eof
:ProcessDir
set /a Check=%~n1
if %Check% neq 0 set "Name=%~1"
goto :eof
bastla
Hallo Lampux!
Die Untersuchung des Namens erfolgt in einem Unterprogramm und besteht eigentlich nur darin, den Namen einer numerischen Variablen zuzuweisen - wenn sich aus dem Namen keine gültige Zahl machen lässt, wird der Inhalt der Variablen 0 sein ...
Wenn ein entsprechender Ordner gefunden wird, steht dessen Pfad in %Name% und kann daher unmittelbar in das ftp-Script geschrieben werden - zusammengesetzt also etwa so (das "
[Edit] Mit 0 beginnende Ordnernamen berücksichtigt [/Edit]
Grüße
bastla
ob es nun in alle Ordner geht oder nur in die Zahlenkominations-Ordner
"In" Ordner geht es eigentlich nur hinsichtlich des Startordners (siehe unten Zeile 2) - darin werden mit der "for /d
"-Schleife alle Unterordner daraufhin untersucht, ob sie einen rein numerischen Namen haben (eine Prüfung, ob dieser auch genau 9 Stellen lang ist, kann ich bei Bedarf nachreichen).Die Untersuchung des Namens erfolgt in einem Unterprogramm und besteht eigentlich nur darin, den Namen einer numerischen Variablen zuzuweisen - wenn sich aus dem Namen keine gültige Zahl machen lässt, wird der Inhalt der Variablen 0 sein ...
Wenn ein entsprechender Ordner gefunden wird, steht dessen Pfad in %Name% und kann daher unmittelbar in das ftp-Script geschrieben werden - zusammengesetzt also etwa so (das "
echo on
" wird nach der Testphase natürlich ein "echo off
"):@echo on & setlocal
set "Ordner=C:\Users\Lampux\Desktop\Eingang"
set "Name="
for /d %%i in ("%Ordner%\*.*") do call :ProcessDir "%%i"
if not defined Name echo Nicht gefunden & goto :eof
set tempftp=%temp%\fileserver.ftp
:# ftp-skript erzeugen
echo OPEN server > %tempftp%
echo USER name pw >> %tempftp%
echo cd /public_html >> %tempftp%
echo send %Name% >> %tempftp%
echo disconnect >> %tempftp%
echo quit >> %tempftp%
:# alles ausführen
ftp.exe -n -i -s:%tempftp%
del %tempftp%
pause
goto :eof
:ProcessDir
set /a Check=1%~n1 2>nul || goto :eof
if %Check% neq 0 set "Name=%~1"
goto :eof
Grüße
bastla
Hallo Lampux!
Soferne Du sicher sein kannst, dass Ordner nur von Deinem Batch erstellt werden, sollte es genügen, die letzte vergebene Nummer in einer Textdatei zu speichern und beim jeweils nächsten Upload hochzuzählen - also (ungetestet) etwa:
Danach enthält die Variable %dynamisch% neben dem festen Text "Ordner" eine dreistellige Nummer (inkl. führender Nullen).
Vor dem ersten Start musst Du noch die Textdatei lt Pfad in Zeile 1 erstellen und in die erste Zeile den Wert 1000 schreiben (dann wird beim ersten Aufruf auf 1001 erhöht, wovon die letzen 3 Stellen, also "001", für die Erstellung des dynamischen Ordnernamens verwendet werden).
Grüße
bastla
[Edit] Fehlendes "=" nachgetragen [/Edit]
Soferne Du sicher sein kannst, dass Ordner nur von Deinem Batch erstellt werden, sollte es genügen, die letzte vergebene Nummer in einer Textdatei zu speichern und beim jeweils nächsten Upload hochzuzählen - also (ungetestet) etwa:
set "NrDat=C:\User\Lampux\Nr.txt"
if not exist "%NrDat%" echo "%NrDat%" nicht gefunden! & goto :eof
set /p Nr=<"%NrDat%"
set /a Nr+=1
>"%NrDat%" echo %Nr%
set "dynamisch=Ordner%Nr:~-3%"
Vor dem ersten Start musst Du noch die Textdatei lt Pfad in Zeile 1 erstellen und in die erste Zeile den Wert 1000 schreiben (dann wird beim ersten Aufruf auf 1001 erhöht, wovon die letzen 3 Stellen, also "001", für die Erstellung des dynamischen Ordnernamens verwendet werden).
Grüße
bastla
[Edit] Fehlendes "=" nachgetragen [/Edit]
Hallo Lampux!
Weshalb der Ordner auf dem Server nicht angelegt wird, kann ich leider auch nicht sagen ...
Noch ein Hinweis zur Verwaltung der laufenden Nummer: Wenn Du die Datei "Nr.txt" auf einer Freigabe im Netz ablegst, kann sie von mehreren Rechnern aus verwendet werden.
BTW: Für die Erstellung des ftp-Scripts finde ich die Schreibweise mit vorangestelltem "
Grüße
bastla
P.S.: Zum Posten von Batches oder unverändert wiederzugebenden Daten bitte Code-Tags verwenden ...
[Edit] Fehlendes "=" nachgetragen [/Edit]
Weshalb der Ordner auf dem Server nicht angelegt wird, kann ich leider auch nicht sagen ...
Außerdem habe ich die Wörter "Lampux" durch "mr" ersetzt, damit ich es auf einem anderen PC testen kann.
Ist ja eigentlich nicht vom Rechner, sondern vom User abhängig - daher könntest Du den Pfad auch allgemein so festlegen:set "Ordner=%userprofile%\Desktop\Eingang"
@echo on & setlocal
set "Ordner=%userprofile%\Desktop\Eingang"
set "NrDat=C:\User\mr\Desktop\Nr.txt"
::set "NrDat=\\Server\Freigabe\Nr.txt"
set "Name="
for /d %%i in ("%Ordner%\*.*") do call :ProcessDir "%%i"
if not defined Name echo Nicht gefunden & goto :eof
set /a Nr=1000
if exist "%NrDat%" set /p Nr=<"%NrDat%"
set /a Nr+=1
>"%NrDat%" echo %Nr%
set "dynamisch=Ordner%Nr:~-3%"
set tempftp=%temp%\fileserver.ftp
:# ftp-skript erzeugen
>%tempftp% echo OPEN server
>>%tempftp% echo USER user pw
>>%tempftp% echo cd /public_html
:: Hier möchte ich nun den neuen Ordner auf dem FTP anlegen, jedoch funktioniert das nicht, ich hoffe du kannst mir dabei helfen
>>%tempftp% echo mkdir %dynamisch%
:: Das Wechseln in das Verzeichnis geht dann logischerweise auch nicht, da der Ordner nicht existiert
>>%tempftp% echo cd /public_html/%dynamisch%
>>%tempftp% echo lcd %Name%
>>%tempftp% echo mput *
>>%tempftp% echo disconnect
>>%tempftp% echo quit
:# alles ausführen
ftp.exe -n -i -s:%tempftp%
del %tempftp%
pause
goto :eof
:ProcessDir
set /a Check=1%~n1 2>nul || goto :eof
if %Check% neq 0 set "Name=%~1"
goto :eof
>>%tempftp%
" lesbarer ...Grüße
bastla
P.S.: Zum Posten von Batches oder unverändert wiederzugebenden Daten bitte Code-Tags verwenden ...
[Edit] Fehlendes "=" nachgetragen [/Edit]
Hallo Lampux!
Die Zeile 11 muss so lauten (ich ändere das auch oben):
Was den Rest angeht, kannst Du Dir einmal das oben bereits verwendete "
Die beschriebene Zerlegung (zB "
Grüße
bastla
Es erhöht leider den Ordnername um +1 nicht.
Kann's ja auch gar nicht, wenn ein "=" fehlt ... Die Zeile 11 muss so lauten (ich ändere das auch oben):
if exist "%NrDat%" set /p Nr=<"%NrDat%"
Was den Rest angeht, kannst Du Dir einmal das oben bereits verwendete "
for /d
" ansehen - damit werden alle Unterordner eines Ordners aufgelistet - Alternative (zum Testen von der Kommandozeile, daher mit jeweils nur einem Prozentzeichen):for /r "C:\User\mr\Desktop\Files" %i in (.) do @echo LW undPfad: "%~dpi" Ordnername: "%~ni"
%~ni
") kannst Du auch bei der "for /d
"-Schleife einsetzen ...Grüße
bastla
Hallo Lampux!
Das Ergänzen des "=" im obigen Batch war leider zwischenzeitlich auf der Strecke geblieben , ist aber jetzt erfolgt ...
Ansonsten: Ein Test (mit etwas anderem Dateipfad und dem Inhalt "1003" in der Datei "Nr.txt") liefert bei mir folgende Ausgabe:
Der Batch dafür:
Grüße
bastla
Das Ergänzen des "=" im obigen Batch war leider zwischenzeitlich auf der Strecke geblieben , ist aber jetzt erfolgt ...
Ansonsten: Ein Test (mit etwas anderem Dateipfad und dem Inhalt "1003" in der Datei "Nr.txt") liefert bei mir folgende Ausgabe:
D:\>set "NrDat=D:\Nr.txt"
D:\>set /a Nr=1000
D:\>if exist "D:\Nr.txt" set /p Nr= 0<"D:\Nr.txt"
D:\>set /a Nr+=1
D:\>echo 1004 1>"D:\Nr.txt"
D:\>set "dynamisch=Ordner004"
D:\>echo Ordner004
Ordner004
@echo on & setlocal
set "NrDat=D:\Nr.txt"
set /a Nr=1000
if exist "%NrDat%" set /p Nr=<"%NrDat%"
set /a Nr+=1
>"%NrDat%" echo %Nr%
set "dynamisch=Ordner%Nr:~-3%"
echo %dynamisch%
bastla
Hallo Lampux!
Um alle passenden Ordner zu verarbeiten, könnte in der Schleife jeweils ein eigener Übertragungsvorgang durchgeführt werden, also etwa:
Was das Auslesen der bereits am Server vorhandenen Ordner anlangt: Poste bitte das Format, in dem das per ftp abgerufene Inhaltsverzeichnis dargestellt wird ...
Grüße
bastla
[Edit] Fehlendes "u" bei "equ" ergänzt [/Edit]
Um alle passenden Ordner zu verarbeiten, könnte in der Schleife jeweils ein eigener Übertragungsvorgang durchgeführt werden, also etwa:
@echo off & setlocal
set "Ordner=%userprofile%\Desktop\Eingang"
::set "NrDat=\\Server\Freigabe\Nr.txt"
for /d %%i in ("%Ordner%\*.*") do call :ProcessDir "%%i"
goto :eof
:ProcessDir
set /a Check=1%~n1 2>nul || goto :eof
if %Check% equ 0 goto :eof
set "Name=%~1"
:: Version mit Zähler
::set /a Nr=1000
::if exist "%NrDat%" set /p Nr=<"%NrDat%"
::set /a Nr+=1
::>"%NrDat%" echo %Nr%
::set "dynamisch=Ordner%Nr:~-3%"
::
:: ftp-Inhaltsverzeichnis auslesen und %dynamisch% ermitteln
::
set tempftp=%temp%\fileserver.ftp
:# ftp-skript erzeugen
>%tempftp% echo OPEN server
>>%tempftp% echo USER user pw
>>%tempftp% echo cd /public_html
>>%tempftp% echo mkdir %dynamisch%
>>%tempftp% echo cd /public_html/%dynamisch%
>>%tempftp% echo lcd %Name%
>>%tempftp% echo mput *
>>%tempftp% echo disconnect
>>%tempftp% echo quit
:# alles ausführen
ftp.exe -n -i -s:%tempftp%
del %tempftp%
pause
goto :eof
Was das Auslesen der bereits am Server vorhandenen Ordner anlangt: Poste bitte das Format, in dem das per ftp abgerufene Inhaltsverzeichnis dargestellt wird ...
Grüße
bastla
[Edit] Fehlendes "u" bei "equ" ergänzt [/Edit]
Hallo Lampux!
Da ja nicht Du, sondern Dein Script im entsprechenden Ordner nachsehen soll, war gemeint, wie die Ausgabe eines per "ftp" durchgeführten "dir" aussieht - also
Die Zeile für einen Ordner könnte dann zB so aussehen:
Grüße
bastla
P.S.:
"eq" kann syntaktisch an dieser Stelle nicht verarbeitet werden.
Mit "equ" solltest Du bessere Chancen haben (sorry - ich korrigier's oben) ...Da ja nicht Du, sondern Dein Script im entsprechenden Ordner nachsehen soll, war gemeint, wie die Ausgabe eines per "ftp" durchgeführten "dir" aussieht - also
OPEN server
USER user pw
dir /public_html
drwxr-x--- 2 web web 4096 Jan 31 2010 ordner001
bastla
P.S.:
nach ewigen DRUCK Versuchen hab ich sie endlich erwischt
Batches solltest Du aus einer geöffneten CMD-Shell heraus testen - dann kannst Du auch Fehlermeldungen ganz entspannt lesen ...
Hallo Lampux!
Wenn die zwei (oder mehr) Ordner jeweils unmittelbare Unterordner von "Eingang" sind, kann ich nicht nachvollziehen, dass nur einer davon verarbeitet würde - daher ändere ich diesen Teil des Batches für's Erste nicht ...
In der folgenden (weitgehend ungetesteten Version) sollte das Auslesen und Hochzählen der Ordnernummer klappen:
Grüße
bastla
Wenn die zwei (oder mehr) Ordner jeweils unmittelbare Unterordner von "Eingang" sind, kann ich nicht nachvollziehen, dass nur einer davon verarbeitet würde - daher ändere ich diesen Teil des Batches für's Erste nicht ...
In der folgenden (weitgehend ungetesteten Version) sollte das Auslesen und Hochzählen der Ordnernummer klappen:
@echo off & setlocal
set "Ordner=%userprofile%\Desktop\Eingang"
set "tempftpdir=%temp%\ftpdir.txt"
set "tempftp=%temp%\fileserver.ftp"
:# ftp-Skript zum Lesen des Inhaltsverzeichnisses erzeugen
>%tempftp% echo OPEN server
>>%tempftp% echo USER user pw
>>%tempftp% echo dir /public_html
>>%tempftp% echo bye
del "%tempftpdir%" 2>nul
for /f "tokens=9" %%i in ('ftp.exe -n -s:%tempftp%|findstr /b "d"|findstr "Ordner"') do >>"%tempftpdir%" echo %%i
for /f %%i in ('sort "%tempftpdir%"') do set "Nr=%%i"
set /a Nr=1%Nr:~6% + 1
echo Naechste Ordnernummer: %Nr:~-3%
for /d %%i in ("%Ordner%\*.*") do call :ProcessDir "%%i"
goto :eof
:ProcessDir
set /a Check=1%~n1 2>nul || goto :eof
if %Check% equ 0 goto :eof
set "Name=%~1"
set "dynamisch=Ordner%Nr:~-3%"
set /a Nr+=1
:# ftp-skript erzeugen
>%tempftp% echo OPEN server
>>%tempftp% echo USER user pw
>>%tempftp% echo cd /public_html
>>%tempftp% echo mkdir %dynamisch%
>>%tempftp% echo cd /public_html/%dynamisch%
>>%tempftp% echo lcd %Name%
>>%tempftp% echo mput *
>>%tempftp% echo disconnect
>>%tempftp% echo quit
:# alles ausführen
ftp.exe -n -i -s:%tempftp%
pause
goto :eof
bastla
Hallo Lampux!
Füge vor Zeile 14 ein:
und wenn Du schon dabei bist, könntest Du noch die Zeile 15 auf
ändern ...
Ich hatte leider unterstellt, dass es schon einen Ordner "Ordner001" gäbe - wenn dieser (oder ein anderer mit dreistelliger Nummer benannter) Ordner noch nicht vorhanden ist, braucht es die Vorgabe der Nummer "001" (dazu dient die erste Codezeile oben).
Grüße
bastla
Füge vor Zeile 14 ein:
set "Nr=1001"
set /a Nr=1%Nr:~-3% + 1
Ich hatte leider unterstellt, dass es schon einen Ordner "Ordner001" gäbe - wenn dieser (oder ein anderer mit dreistelliger Nummer benannter) Ordner noch nicht vorhanden ist, braucht es die Vorgabe der Nummer "001" (dazu dient die erste Codezeile oben).
Grüße
bastla