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...
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 129386
Url: https://administrator.de/contentid/129386
Ausgedruckt am: 17.11.2024 um 11:11 Uhr
20 Kommentare
Neuester Kommentar
Hallo Inferior!
direkt an der Kommandozeile austesten ...
Sobald dann die Datei gefunden (und mit dem gesamten Pfad in
bzw
Um aus dem resultierenden Pfad "c:\bekannterPfad\unbekannterPfad" jetzt noch "unbekannterPfad" zu extrahieren, kann "
[Edit]
Hast Du meine Batchzeile denn überhaupt getestet?
[/Edit]
Grüße
bastla
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 mitdir /b /s bekannterPfad\DateiNamen
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
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 ...und genau der taucht ja nirgends auf, da er ja nicht gekannt ist.. und ich auch nicht angeben kann wo die datei liegt
Hast Du meine Batchzeile denn überhaupt getestet?
[/Edit]
Grüße
bastla
Hallo Inferior!
Kannst Du den Pfad (inkl Dateinamen) posten, mit dem es nicht funktioniert? Bei meinem Test mit Deinem Beispielpfad
wird mit der Batchzeile
wunschgemäß die Ausgabe
erzeugt.
Als (aufwändigere) Alternative:
Damit würden auch mehrere Ordnerebenen berücksichtigt. Wichtig ist, dass am Ende des Basis-Pfades in Zeile 1 ein "\" steht.
Grüße
bastla
Kannst Du den Pfad (inkl Dateinamen) posten, mit dem es nicht funktioniert? Bei meinem Test mit Deinem Beispielpfad
c:\bekannterPfad\unbekannterPfad\bekannterDateiNamen
for /f "delims=" %%i in ('dir /b /s "c:\bekannterPfad\bekannterDateiNamen"') do for %%a in ("%%i\..") do echo SEND "%%~nxa"
SEND "unbekannterPfad"
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%
Grüße
bastla
'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:
oder
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
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 Inferior!
Es sollte aber genügen, ein Unterprogramm zu verwenden - dann kann jede gefundene Datei verarbeitet werden:
Grüße
bastla
P.S.: Bitte für das Posten von Code die verwenden ...
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) ... meine batch kopiert im moment IRGENDEINE datei namens "zieldatei" vom pfad "bekannter teilpfad"
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
bastla
P.S.: Bitte für das Posten von Code die verwenden ...
Hallo Inferior!
Da Du ein "
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 "
Grüße
bastla
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
Hallo Inferior!
Grüße
bastla
P.S.: Ich finde die Schreibweise mit vorangestellter Umleitung (
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:und die bitte mit nem echo befehl in die "daten-ftp" schreiben
>"%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
bastla
P.S.: Ich finde die Schreibweise mit vorangestellter Umleitung (
>>"%temp%\daten.ftp"
) übersichtlicher ...