inferior
Goto Top

Batch - mehrere zeichenfolgen mit echo in einer zeile

Hallo zusammen, nun ich hab mich heute schon den ganzen tag duch foren gehangelt und hab auch schon das meiste meiner batch geschafft. dennoch bin ich gerade ziemlich am verzweifeln und vor allem am zweifeln an mir selbst... face-sad

es geht um folgendes:

eine bestimmte datei befindet sich im pfad c:\bekannterPfad\unbekannterPfad\bekannterDateiNamen

problem ist das der pfad nur zu 90% bekannt ist und der letzte order von pc zu pc verschieden ist.
ich brauch aber den vollständigen pfad also hab ichs erst mit stern oder % usw. versucht:

c:\bekannterPfad\*\bekannterDateiNamen

klappt nicht also hab ich mit hilfe von

cd c:\bekannterPfad\
dir /A /B "bekannterDateiNamen" /S

gearbeitet und mir den pfad in eine txt gepackt.
von dort kann ich ihn auch aufrufen aber ich muss eine andere datei erstellen,
die einen befehl vorransetzt und dahinter (und nicht darunter) den vollständigen Pfad.

also mit

echo SEND >> c:\zuschreibendeDatei
dir /A /B "bekannterDateiNamen" /S >> c:\zuschreibendeDatei

geht das nicht, da es dann untereinander geschrieben wird.

wie kann ich direkt den pfad verwenden, noch besser wäre es nur den unbekannten pfad "unbekannterPfad/" auszulesen und in eine variable zu packen.
hab damit auch schon gearbeitet aber 1. bekomm ich das mit der variable trotz intensiven suchens in foren nicht hin bzw ist noch das problem da das der pfad den ich auslese
c:Dokumente und Einstellungen\Benutzername
heißt
``und nicht %USERPROFILE%\

fazit

ich brauche einen beffehl der in etwa so geht:

springe bis zum letzten bekannten ordner
suche darin meine datei
isoliere die url
schneide nur den unbekannten ordnerpfadnamen heraus und speichere diesen in einer variablen
sage der befehl SEND und die variable für meinen isolierten unbekannten ordnerpfadnamen sollen in einer datei in EINER zeile hintereinander stehen


ich hoffe mir kann hier geholfen werden. bin echt am verzweifeln.. wo es doch nur noch ein kleiner schritt ist.. dann wäre meine batch fertig.

gruß Inferior

Content-ID: 129386

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

Ausgedruckt am: 17.11.2024 um 11:11 Uhr

bastla
bastla 14.11.2009 um 22:47:15 Uhr
Goto Top
Hallo Inferior und willkommen im Forum!

Das sollte so zu machen sein:
for /f "delims=" %%i in ('dir /b /s "c:\bekannterPfad\bekannterDateiNamen"') do for %%a in ("%%i\..") do >>c:\zuschreibendeDatei echo SEND "%%~nxa"
Grüße
bastla

[Edit] "delims=" nachgetragen [/Edit]
Inferior
Inferior 14.11.2009 um 23:54:25 Uhr
Goto Top
hallo bastla,

erst mal vielen vielen dank für die schnelle antwort und die begrüßung.

nun hab das mal getestet und leider funktioniert das noch nicht.
hab mir das mal angesehn und versteh leider nicht ganz warum du den bekanntenPfad und den bekanntenDateiNamen in einen pfad steckst
dazwischen befindet sich ja noch der unbekannte pfad

also bekannterPfad\unbekannterPfad\DateiNamen

und das mit dem %%i/.. versteh ich nicht ganz

könntest du mir das nochmal erklären.

beste grüße Inferior


EDIT:

So, hab mich nochmals damit beschäftigt und vom prinip würde deine idee sogar funtionieren.
Das problem ist nur, das dein ablauf versucht den letzten ordner der datei zu isolieren.
und genau der taucht ja nirgends auf, da er ja nicht gekannt ist.. und ich auch nicht angeben kann wo die datei liegt
ich weiß ja nur wie sie heißt und das sie in C:\bekannterPfad\ liegt
das es nur ein ordner ist der mir nicht bekannt ist und das hinter dem gekannten pfad nicht mehr viel an dateien sind ist mir auch bekannt
also wie gesagt es ist nur so das der ordner einmal zB 123456789 heißt in dem die datei ist und einmal zB 987654321
bastla
bastla 15.11.2009 um 00:13:30 Uhr
Goto Top
Hallo Inferior!
versteh leider nicht ganz warum du den bekanntenPfad und den bekanntenDateiNamen in einen pfad steckst
Da der "dir"-Befehl ja mit dem Schalter "/s" ausgeführt wird, genügt es, einen "Startordner" anzugeben, unterhalb dessen dann die Datei gesucht wird - kannst Du leicht mit
dir /b /s bekannterPfad\DateiNamen
direkt an der Kommandozeile austesten ...

Sobald dann die Datei gefunden (und mit dem gesamten Pfad in %%i enthalten) ist, kann mit "%%i\.." der Ordner, in welchem die Datei liegt, angesprochen werden (ginge zwar auch mit %%~dpi, aber diese Schreibweise liefert den Pfad mit einem abschließenden "\", der hier stören würde) - auch das lässt sich durch Direkteingabe nachvollziehen:
for %a in ("c:\bekannterPfad\unbekannterPfad\bekannterDateiNamen\..") do @for %a in ("%i\..") do @echo %a
bzw
for /f %i in ('dir /b /s "c:\bekannterPfad\bekannterDateiNamen"') do @echo %~dpi

Um aus dem resultierenden Pfad "c:\bekannterPfad\unbekannterPfad" jetzt noch "unbekannterPfad" zu extrahieren, kann "%%~nxa" verwendet werden - eigentlich wird damit zwar Datei-Name und Datei-Extension extrahiert (siehe "for /?"), aber für den CMD-Interpreter gilt alles nach dem letzten "\" eines Pfades als "Datei". Sollte darin dann mindestens ein Punkt enthalten sein, so wird der Teil ab dem letzten Punkt als "Extension" angesehen (daher zur Sicherheit "%%~nxa" - ist kein Punkt enthalten, schadet das "x" auch nicht).

[Edit]
Das problem ist nur, das dein ablauf versucht den letzten ordner der datei zu isolieren.
und genau der taucht ja nirgends auf, da er ja nicht gekannt ist.. und ich auch nicht angeben kann wo die datei liegt
Unter der Annahme, dass es nur um genau eine Ordnerebene geht, sollte dieser "unbekanntePfad" wie oben beschrieben zu erhalten sein - wenn es mehrere Ordnerebenen sein können, wäre eine andere Strategie erforderlich ...

Hast Du meine Batchzeile denn überhaupt getestet?
[/Edit]

Grüße
bastla
Inferior
Inferior 15.11.2009 um 00:33:13 Uhr
Goto Top
Hallo bastla,

Nun also getestet hab ich das selbstverständlich. das ist denke ich der einfachste und beste weg um zu sehen ob es funktioniert.
bei meinem vorhaben klappte es nicht.
aber als ich eine datei zum testen mit nem vollständigen pfad verwendet hab hat mir die batch den letzten ordner und das SEND davor ausgegeben.

also grundsätzlich funktioniert das.

aber wenn ich es in meinem fall so wie du sagst angebe, dann hab ich ja nen pfad bis hin zu meiner datei der zwischen drin unvollständig ist..

in die zu erstellende datei schreibt es dann:

SEND " "

das es sich hier definitiv nur um den letzten ordner handelt der bei meinem pfad unvollständig ist kann ich sicher sagen
bastla
bastla 15.11.2009 um 00:51:23 Uhr
Goto Top
Hallo Inferior!

Kannst Du den Pfad (inkl Dateinamen) posten, mit dem es nicht funktioniert? Bei meinem Test mit Deinem Beispielpfad
c:\bekannterPfad\unbekannterPfad\bekannterDateiNamen
wird mit der Batchzeile
for /f "delims=" %%i in ('dir /b /s "c:\bekannterPfad\bekannterDateiNamen"') do for %%a in ("%%i\..") do echo SEND "%%~nxa"
wunschgemäß die Ausgabe
SEND "unbekannterPfad"
erzeugt.
Als (aufwändigere) Alternative:
set "Basis=c:\bekannterPfad\"  
set "Datei=bekannterDateiNamen"  

for /f "delims=" %%i in ('dir /s /b "%Basis%%Datei%"') do set "Pfad=%%~dpi"  
call set "RelPfad=%%Pfad:%Basis%=%%"  
echo SEND %RelPfad:~,-1%
Damit würden auch mehrere Ordnerebenen berücksichtigt. Wichtig ist, dass am Ende des Basis-Pfades in Zeile 1 ein "\" steht.

Grüße
bastla
bastla
bastla 15.11.2009 um 01:01:20 Uhr
Goto Top
Nachtrag:
Sorry - Dein Pfad enthält ja mindestens ein Leerzeichen, daher fehlte "delims=" - ich trage das gleich oberhalb (bzw ganz oben) nach ...

Grüße
bastla
Inferior
Inferior 15.11.2009 um 01:10:19 Uhr
Goto Top
Hallo bastla,

nochmals vielen danke für dein bemühen!

mit dem set befehl funktioniert es!!!
warum es nicht mit dem anderen nicht geht weiß ich leider auch nicht

ein problem besteht noch und zwar,
dass echo beim übertragen von %USERPROFILE% das automatisch in die neue datei in c:\Dokumente und Eistellungen\Benutzernamen\ umwandelt
wenn es dann in der neuen datei verwendet wird führt es zu problemen
bastla
bastla 15.11.2009 um 01:18:03 Uhr
Goto Top
Hallo Inferior!
warum es nicht mit dem anderen nicht geht weiß ich leider auch nicht
Sollte es inzwischen (siehe Nachtrag) ...

Um %USERPROFILE% in eine Datei zu schreiben, jeweils zwei Prozentzeichen verwenden, also: %%USERPROFILE%% (Alternative: ^%USERPROFILE^%) ...

Grüße
bastla
57263
57263 15.11.2009 um 10:49:58 Uhr
Goto Top
'tschuldige bitte, wenn ich mich einmische. Mir ist nicht ganz klar, was Du mit der Erkenntnis machen möchtest. Ich nehme an, dass Du bearbeiten oder kopieren willst. Es geht, wenn ich die Aufgabe richtig verstanden habe, auch relativ einfach mit xcopy.exe und robocopy.exe:

xcopy bekannterPfadanteil\bekannteDatei /s Zielpfad

oder

robocopy bekannterPfadanteil bekannteDatei Zielpfad /s

Der z.T. unbekannte Quellpfad wird dabei im Zielpfad wieder erzeugt und wird somit bekannt. Bei Verwendung von Robycopy kann man ein Logdatei erzeugen, in der alle Infos wie Quell- und Zielpfad geloggt werden. Allerdings werden alle Dateien mit zutreffendem Namen in ihrem Quellpfad erkannt und kopiert.

Christian Tietje
Inferior
Inferior 28.11.2009 um 14:52:45 Uhr
Goto Top
Hallo an euch

erst mal möchte ich mich entschuldigen, da ich abschlussprüfung hatte und deshalb sehr beschäftigt war.
erst mal ein herzliches danke an bastla, der mir sehr weitergeholfen hat.
das mit dem set funktioniert hervorragend und auch das mit dem doppelten %% face-smile


Zitat von @57263:
'tschuldige bitte, wenn ich mich einmische. Mir ist nicht ganz
klar, was Du mit der Erkenntnis machen möchtest. Ich nehme an,
dass Du bearbeiten oder kopieren willst. Es geht, wenn ich die Aufgabe
richtig verstanden habe, auch relativ einfach mit xcopy.exe und
robocopy.exe:

xcopy bekannterPfadanteil\bekannteDatei /s Zielpfad

oder

robocopy bekannterPfadanteil bekannteDatei Zielpfad /s

Der z.T. unbekannte Quellpfad wird dabei im Zielpfad wieder erzeugt
und wird somit bekannt. Bei Verwendung von Robycopy kann man ein
Logdatei erzeugen, in der alle Infos wie Quell- und Zielpfad geloggt
werden. Allerdings werden alle Dateien mit zutreffendem Namen in ihrem
Quellpfad erkannt und kopiert.

Christian Tietje

Hallo Christian

hab das mal getestet und muss feststellen das dies leider nicht funktioniert.
der teilpfad ist auf jedem PC gleich, danach folgt nur ein ordner unbekanntem namens und dann die zieldatei
bei deiner metode findet er die zieldateil leider nicht.


ich arbeite jetzt mit dem set befehl von bastla, dieser funktioniert auch aber
ich musste feststellen das es manchmal mehrer ordner im "bekannten teilpfad" gibt in denen dateien mit dem namen "zieldatei" sind
meine batch kopiert im moment IRGENDEINE datei namens "zieldatei" vom pfad "bekannter teilpfad"
es sollen aber alle dateien namens "zieldatei" kopiert werden und es muss definiert werden können aus welchem ordner die datei ist


mein aktueller code

@echo off

set "Basis=bekannter teilpfad"   
set "Datei1=a.txt"  
set "Datei2=b.txt"     
for /f "delims=" %%i in ('dir /s /b "%Basis%%Datei1%"') do set "Pfad=%%~dpi"  
call set "RelPfad=%%Pfad:%Basis%=%%"  

xcopy /Q/Y "bekannter teilpfad\%RelPfad:~,-1%\a.txt" "%temp%\"  
xcopy /Q/Y "bekannter teilpfad\%RelPfad:~,-1%\b.txt" "%temp%\"  

ping -n 1 localhost >nul

zip32 "%temp%\a.txt" "%temp%\b.txt" "c:\%RelPfad:~,-1%.zip"  

exit

die batch kopiert a.txt und b.txt nach temp und zipt beide
den zippordner wird genauso genant wie der unbekannte dateipfad
bastla
bastla 28.11.2009 um 15:07:14 Uhr
Goto Top
Hallo Inferior!
ich musste feststellen das es manchmal mehrer ordner im "bekannten teilpfad" gibt in denen dateien mit dem namen "zieldatei" sind
meine batch kopiert im moment IRGENDEINE datei namens "zieldatei" vom pfad "bekannter teilpfad"
Biber würde dazu sagen: Works as designed (oder, mit anderen Worten: Von mehreren Ordnern war bisher nicht die Rede) ... face-wink

Es sollte aber genügen, ein Unterprogramm zu verwenden - dann kann jede gefundene Datei verarbeitet werden:
@echo off & setlocal

set "Basis=bekannter teilpfad"  
set "Datei1=a.txt"  
set "Datei2=b.txt"  

for /f "delims=" %%i in ('dir /s /b "%Basis%%Datei1%"') do call :ProcessDir "%%i"  
goto :eof

:ProcessDir
set "Pfad=%~dp1"  
call set "RelPfad=%%Pfad:%Basis%=%%"  
xcopy /Q/Y "bekannter teilpfad\%RelPfad:~,-1%\%Datei1%" "%temp%\"  
xcopy /Q/Y "bekannter teilpfad\%RelPfad:~,-1%\%Datei2%" "%temp%\"  
ping -n 1 localhost >nul
zip32 "%temp%\%Datei1%" "%temp%\%Datei2%" "c:\%RelPfad:~,-1%.zip"  
goto :eof
Grüße
bastla

P.S.: Bitte für das Posten von Code die verwenden ...
Inferior
Inferior 28.11.2009 um 15:44:39 Uhr
Goto Top
Hallo Bastla face-smile

das mit der formatierung hab ich oben gleich mal ausgebessert ;)

davon war wirklich nicht die rede, dass das ganze auch mit mehreren dateien funktionieren muss. ist mir leider erst hinterher aufgefallen.

und zu deinem code
hammer funktioniert super
bin immer wieder positiv überrascht das hier alles so schnell und vor allem so hilfreich zu geht

einziges problem ist
mit goto :eof (wenn alle dateien kopiert sind und keine mit selben namen da sind) beendet er die batch
ich möchte aber an die batch noch etwas anhängen
sprich wenn das kopieren abgeschlossen ist soll er nach zB :next springen und da weitere befehle ausführn
bekomm das nicht hin wegen dem :eof

gruß Inferior
bastla
bastla 28.11.2009 um 15:53:56 Uhr
Goto Top
Hallo Inferior!

Da Du ein "exit" verwendet hattest (was ich grundsätzlich vermeide, da damit auch die CMD-Shell, in der ich teste, geschlossen wird), war ich davon ausgegangen, dass keine weiteren Befehle folgen sollten ...

Um trotzdem noch mehr Anweisungen im Batch unterzubringen, kannst Du diese entweder am Ende des Hauptprogrammes (= zwischen den Zeilen 7 und 8) einfügen oder das "goto :eof" in der Zeile 8 tatsächlich auf "goto :next" ändern und unterhalb von Zeile 17 ":next" und die weiteren benötigten Zeilen anfügen.
das mit der formatierung hab ich oben gleich mal ausgebessert ;)
Danke - damit ist es ua auch leichter, sich (mittels Zeilnenummern) auf Deinen Code zu beziehen ...

Grüße
bastla
Inferior
Inferior 29.11.2009 um 21:26:15 Uhr
Goto Top
Hallo Bastla,

nun das funktioniert sehr gut.
mit dem code geb ich dir natürlich recht! hab aber leider nicht gewusst wie man das hier macht.
das mit dem exit ist wohl mein fehler face-sad

mein aktueller code sieht so aus:

@echo off & setlocal 

set "Basis=Bekannter Teilpfad"   
set "Datei1=a.txt"   
set "Datei2=b.txt"   
for /f "delims=" %%i in ('dir /s /b "%Basis%%Datei1%"') do call :ProcessDir "%%i"   
goto next

:ProcessDir 

set "Pfad=%~dp1"   
call set "RelPfad=%%Pfad:%Basis%=%%"   
xcopy /Q/Y "Bekannter Teilpfad\%RelPfad:~,-1%\%Datei1%" "c:\Kopiert %RelPfad:~,-1%\"   
xcopy /Q/Y "Bekannter Teilpfad\%RelPfad:~,-1%\%Datei2%" "c:\Kopiert %RelPfad:~,-1%\"   

zip32 "c:\Kopiert %RelPfad:~,-1%" "c:\Kopiert %RelPfad:~,-1%.zip"  

echo OPEN www.testftp.de >> "%temp%\daten.ftp"  
echo USER testuser >> "%temp%\daten.ftp"  
echo testpasswort >> "%temp%\daten.ftp"  
echo CD Kopiert >> "%temp%\daten.ftp"  
echo BINARY >> "%temp%\daten.ftp"  
echo DEBUG >> "%temp%\daten.ftp"  
echo PUT "c:\Kopiert %RelPfad:~,-1%.zip" >> "%temp%\daten.ftp"  
echo PUT "c:\Kopiert %RelPfad:~,-1%.zip" >> "%temp%\daten.ftp"  
echo disconnect >> "%temp%\daten.ftp"  
echo quit >> "%temp%\daten.ftp"  

ping -n 1 localhost >nul
ftp.exe -n -i -s:"%temp%\daten.ftp"  
goto :eof

:next
del "%temp%\daten.ftp"  
del "c:\Kopiert %RelPfad:~,-1%.zip"  

exit

im klartext:

das batch soll nach datei a.txt und b.txt im bekannten teilpfad suchen
dabei ist es möglich das es mehrere ordner gibt die datei a.txt und b.txt enthalten

die dateien weden anschließend in den ordner c:\"Ordnername in dem die dateien a.txt und b.txt liegen" kopiert
und dann gezippt

das heißt es lieget nun der ordner "Kopiert 123456.zip" und "Kopiert 654321.zip" in c:\
beide sollen danach via ftp-verfahren gesichert werden sprich auf nen ftp hochgeladen werden.
das problem ist das ich mei dem befehl PUT für das FTP-verfahren nicht mehr devinieren kann welche dateien (nämlich alle beide oder auch manchmal 3) er hochladen soll

in meinem fall läd er immer und immer wieder ein und die selbe datei hoch
ich hoffe ihr könnt mir helfen.. das ganze birgt anscheinend immer wieder probleme face-sad

glg Inferior
bastla
bastla 29.11.2009 um 22:03:31 Uhr
Goto Top
Hallo Inferior!

Ändere versuchsweise Deine Zeile 18 auf
echo OPEN www.testftp.de>"%temp%\daten.ftp"
Grüße
bastla

P.S.: Das "exit" ist weiterhin überflüssig ...
Inferior
Inferior 29.11.2009 um 22:31:41 Uhr
Goto Top
naja das ändert leider wenig face-sad
ja das exit ist nicht nötig, ich mache es aber gern hin..

also hab das mal bisschen genauer analysiert

die batch erstellt alles richtig in c:\
das heißt es stehen 2 gezippte ordner mit zwei verschiedenen namen bereit

aber in der daten.ftp datei in der festgelegt wird was er via ftp hochladen soll steht 2 mal der selbe ordner drin..
liegt warscheinlich daran das ich ihm ja sage er soll mit dem befehl PUT "c:\Kopiert %RelPfad:~,-1%.zip" hochladen
leider haben ja beide dateien die variable

ich brauche nun etwas das der batch genau sagt in "c:\" liegen 2 dateien die eine heißt "Kopiert xyz.zip" die andere "Kopiert 123.zip"
und die bitte mit nem echo befehl in die "daten-ftp" schreiben
bastla
bastla 29.11.2009 um 22:44:45 Uhr
Goto Top
Hallo Inferior!
ich brauche nun etwas das der batch genau sagt in "c:\" liegen 2 dateien die eine heißt "Kopiert xyz.zip" die andere "Kopiert 123.zip"
und die bitte mit nem echo befehl in die "daten-ftp" schreiben
Soferne es die einzigen .zip-Dateien sind, sollte es ja eigentlich genügen, am Ende der gesamten Verarbeitung alle Dateien am Stück zu versenden - etwa so:
>"%temp%\daten.ftp"  echo OPEN www.testftp.de   
>>"%temp%\daten.ftp" echo USER testuser  
>>"%temp%\daten.ftp" echo testpasswort  
>>"%temp%\daten.ftp" echo CD Kopiert  
>>"%temp%\daten.ftp" echo BINARY  
>>"%temp%\daten.ftp" echo DEBUG  
for %%i in (C:\*.zip) do >>"%temp%\daten.ftp" echo PUT  "%%i"  
>>"%temp%\daten.ftp" echo disconnect  
>>"%temp%\daten.ftp" echo quit  

ping -n 1 localhost >nul 
ftp.exe -n -i -s:"%temp%\daten.ftp"  

del "%temp%\daten.ftp"  
del C:\*.zip
Grüße
bastla

P.S.: Ich finde die Schreibweise mit vorangestellter Umleitung (>>"%temp%\daten.ftp") übersichtlicher ...
Inferior
Inferior 29.11.2009 um 23:02:31 Uhr
Goto Top
Zitat von @bastla:
for %%i in (C:\*.zip) do >>"%temp%\daten.ftp" echo PUT "%%i"

danke genau den ausdruck hab ich gesucht!
hab mir jetzt noch mit dem xcopy befehl einen extra ordner in c:\ geschaffen wo diese dateien drin liegen
damit kann ich sicher gehn das er nur die beiden daten hochläd und nicht versehentlich *.zip dateien die zufällig in c:\ liegen

ob er das ganze auch ordnungsgemäß hochläd kann ich leider im moment nicht sagen da mein FTP gerade nicht zugänglich ist
ich hoffe nur ein technischer fehler vom server da ich auch nicht mit einem file-host-programm rein komm.

noch ne frage, und zwar kann man auch ganze ordner löschen damit in c:\ nicht alles vermüllt wird
mit del kann ich nur dateien löschen
wenn ich den ordner angebe frägt er mich ob ich das wirklich löschen will und es werden nur alle dateien aus dem ordner gelöscht
der leere ordner selbst bleibt in c:\

gruß Inferior

PS: da hast du recht, diese schreibweiße war mir noch nicht bekannt. danke face-smile
bastla
bastla 29.11.2009 um 23:09:37 Uhr
Goto Top
Hallo Inferior!

Für das Löschen von Ordnern gibt es "rd" - ohne Rückfrage ginge das so:
rd /s /q "C:\Ordner"
Grüße
bastla
Inferior
Inferior 01.12.2009 um 16:52:33 Uhr
Goto Top
Hallo Bastla!

danke für alles. konntest mir wirklich alle meine fragen beantworten.
meine batch funktioniert nun so wie sie soll.

großes lob an dich ;)

ich trag den beitrag als gelöst ein

gruß Inferior