Mittels Batch-Datei einen Installationspfad herausfinden
Mein Ziel ist es aus einer Textdatei einen bestimmten Teil herauszuschneiden und in eine neue datei einfügen. Bsp:
auszug der text datei (asdf.txt):
DB OPEN SERVER NAME 192.168.1.34:C:\Programme\consens\zc21\Daten\Ma1\ZcDatenbank.fdb USER NAME consens OPEN
den Teil "C:\Programme\consens\zc21\Daten\Ma1\ZcDatenbank.fdb" müsste ich in einer anderen Textdatei abspeichern können...
Derzeitige batchdatei (auszug ):
set srvini="c:\asdf.txt"
echo %srvini%
For /F "tokens=1-100 delims= " %%A in (%srvini%) Do (
Echo %%A>> Konfig.txt
If "%%A"=="*:\*" (
Echo "%%A*">> Konfig.txt))
Leider funktioniert das überhaupt nicht
Kann mir jemand helfen?? -(ist sowas mit ner Batch-Datei möglich, besitze keinen Kompiler und bis auf den part wär eine Batch-Datei ziemlich praktisch)
auszug der text datei (asdf.txt):
DB OPEN SERVER NAME 192.168.1.34:C:\Programme\consens\zc21\Daten\Ma1\ZcDatenbank.fdb USER NAME consens OPEN
den Teil "C:\Programme\consens\zc21\Daten\Ma1\ZcDatenbank.fdb" müsste ich in einer anderen Textdatei abspeichern können...
Derzeitige batchdatei (auszug ):
set srvini="c:\asdf.txt"
echo %srvini%
For /F "tokens=1-100 delims= " %%A in (%srvini%) Do (
Echo %%A>> Konfig.txt
If "%%A"=="*:\*" (
Echo "%%A*">> Konfig.txt))
Leider funktioniert das überhaupt nicht
Kann mir jemand helfen?? -(ist sowas mit ner Batch-Datei möglich, besitze keinen Kompiler und bis auf den part wär eine Batch-Datei ziemlich praktisch)
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 10894
Url: https://administrator.de/contentid/10894
Ausgedruckt am: 22.11.2024 um 09:11 Uhr
12 Kommentare
Neuester Kommentar
Hallo,
zunächst einmal die vielleicht dumme Frage: Was sind das für Trennzeichen/Delimiter zwischen den einzelnen Einträgen innerhalb einer Zeile? Ich sehe hier Kästchen.
Ich habe die Datei asfd.txt für mich zum Testen deshalb mal vereinfacht und als Trennzeichen Kommata genommen (ich kenne mich mit dem Format nicht aus, also ergibt meine Testdatei vermutlich keinen Sinn), also
Zwischen der IP und dem Pfad habe ich mal ein Komma gesetzt, weil ich die Batch zum Testen ganz einfach wollte:
Wenn der Pfad, den Du willst, immer an der selben Stelle steht, gibt doch einen festen Token an (s.o.)
Das schreibt mir in die Datei konfig.txt:
Könnte es also am delimiter liegen?
Gruß,
TIM
zunächst einmal die vielleicht dumme Frage: Was sind das für Trennzeichen/Delimiter zwischen den einzelnen Einträgen innerhalb einer Zeile? Ich sehe hier Kästchen.
Ich habe die Datei asfd.txt für mich zum Testen deshalb mal vereinfacht und als Trennzeichen Kommata genommen (ich kenne mich mit dem Format nicht aus, also ergibt meine Testdatei vermutlich keinen Sinn), also
NAME,192.168.1.34,C:\Programme\consens\zc21\Daten\Ma1\ZcDatenbank.fdb,USER,NAME,consens,OPEN
Zwischen der IP und dem Pfad habe ich mal ein Komma gesetzt, weil ich die Batch zum Testen ganz einfach wollte:
@echo off
For /f "tokens=4 delims=," %%A in (asdf.txt) Do (
echo %%A>>konfig.txt)
Wenn der Pfad, den Du willst, immer an der selben Stelle steht, gibt doch einen festen Token an (s.o.)
Das schreibt mir in die Datei konfig.txt:
C:\Programme\consens\zc21\Daten\Ma1\ZcDatenbank.fdb
Könnte es also am delimiter liegen?
Gruß,
TIM
irgendwas.bat [srcfile] [result]
___________________________________________________________________
FOR /F "tokens=2,3 delims=:" %%A IN ('TYPE %1') DO echo %%A:%%B >> temp.tmp
FOR /F "tokens=1 delims= " %%C IN ('TYPE temp.tmp') DO echo %%C >> %2
DEL temp.tmp
_____________________________________________________________________
in der zweiten zeile ("delims=") gegebenenfalls das "kasterl" mit dem entsprechenden zeichen ersetzen.
___________________________________________________________________
FOR /F "tokens=2,3 delims=:" %%A IN ('TYPE %1') DO echo %%A:%%B >> temp.tmp
FOR /F "tokens=1 delims= " %%C IN ('TYPE temp.tmp') DO echo %%C >> %2
DEL temp.tmp
_____________________________________________________________________
in der zweiten zeile ("delims=") gegebenenfalls das "kasterl" mit dem entsprechenden zeichen ersetzen.
die kästchen sind mit sehr hoher wahrscheinlichkeit
tabulatoren die lediglich falsch angezeigt werden.
das format wird allseits gern als "tabstop getrennte
textdatei" bezeichnet.
tabulatoren die lediglich falsch angezeigt werden.
das format wird allseits gern als "tabstop getrennte
textdatei" bezeichnet.
Genau die gleiche Problematik tut sich bei mir bzw. bei meinem Kollegen auf:
aus einer Datei in einem bestimmten Verzeichnis sollen Zeilen ausgewertet werden, in dem Pfadangaben stehen, die später ausgeführt werden sollen.
Nehme ich den Befehl wie er als Beispiel in der "help for" steht und führe es direkt im Dos-Fenster aus:
FOR /F "eol=; tokens=2,3* delims=, " %i in (infile.dat) do @echo %i %j %k
wird das erwartete Ergebnis zurückgegeben.
Ausgabe:
X:\Pfadnamen\datei.bat
X:\Pfadnamen\datei2.ini
X:\Pfadnamen\datei3.ini
X:\Pfadnamen\datei4.ksh
Versuche ich das Ganze über eine Batch-Datei zu starten, kommt Blödsinn raus.
Batchdatei:
set IN_FILE="%USERPROFILE%\infile.dat"
FOR /F "eol=; tokens=2,3* delims=, " %%i in (%IN_FILE%) do @echo %%i %%j %%k
Ausgabe:
C:\Dokumente und Einstellungen\username>FOR /F "eol=; tokens=2,3* delims=, " %i
in ("C:\Dokumente und Einstellungen\username\infile.dat") do @echo %i %j %k
und Einstellungen\username\infile.dat
Geht das etwa nicht in einer Batch-Datei?
Gruß Jörg
aus einer Datei in einem bestimmten Verzeichnis sollen Zeilen ausgewertet werden, in dem Pfadangaben stehen, die später ausgeführt werden sollen.
Nehme ich den Befehl wie er als Beispiel in der "help for" steht und führe es direkt im Dos-Fenster aus:
FOR /F "eol=; tokens=2,3* delims=, " %i in (infile.dat) do @echo %i %j %k
wird das erwartete Ergebnis zurückgegeben.
Ausgabe:
X:\Pfadnamen\datei.bat
X:\Pfadnamen\datei2.ini
X:\Pfadnamen\datei3.ini
X:\Pfadnamen\datei4.ksh
Versuche ich das Ganze über eine Batch-Datei zu starten, kommt Blödsinn raus.
Batchdatei:
set IN_FILE="%USERPROFILE%\infile.dat"
FOR /F "eol=; tokens=2,3* delims=, " %%i in (%IN_FILE%) do @echo %%i %%j %%k
Ausgabe:
C:\Dokumente und Einstellungen\username>FOR /F "eol=; tokens=2,3* delims=, " %i
in ("C:\Dokumente und Einstellungen\username\infile.dat") do @echo %i %j %k
und Einstellungen\username\infile.dat
Geht das etwa nicht in einer Batch-Datei?
Gruß Jörg
Moin jtrumpfheller,
klar funktioniert das in Batchdateien, das Problem liegt wieder in den Leerzeichen im Pfad zur infile.dat.
Du musst ja erreichen, dass die Variable %IN_FILE% in der IN-Liste der FOR-Anweisung zuverlässig als Datei interpretiert wird und nicht als Liste von Worten.
Du kannst diesen Interpretationsschwierigkeiten auf mehrere Arten aus dem Wege gehen. Am einfachsten auf die Art, wie angeldust es skizziert hat, mit einem ('type datei') in der Klammer.
Je nachdem, ob Du Deine Variable %IN_FILE% mit oder ohne Anfürungszeichen definiert hast:
(MIT Anfü's) set infile1="C:\Dokumente und Einstellungen\Biber\infile.dat"
(OHNE Anfü's) set "infile2=C:\Dokumente und Einstellungen\Biber\infile.dat"
(OHNE Anfü's) set infile3=C:\Dokumente und Einstellungen\Biber\infile.dat
set inf ...........(Abfrage am CMD-Prompt)
infile1="C:\Dokumente und Einstellungen\Biber\infile.dat"
infile2=C:\Dokumente und Einstellungen\Biber\infile.dat
infile3=C:\Dokumente und Einstellungen\Biber\infile.dat
...Aufruf im Batch:
FOR /F "eol=; tokens=2,3* delims=, " %%i in ('type %infile1%') do echo %%i %%j %%k
..bzw.
FOR /F "eol=; tokens=2,3* delims=, " %%i in ('type "%infile2%"') do echo %%i %j %%k
FOR /F "eol=; tokens=2,3* delims=, " %%i in ('type %"infile3%"') do echo %%i %j %%k
...
HTH Biber
P.S. Ich denke nicht, dass Deine Klausel "eol=; tokens=2,3* delims=, " so sinnvoll ist.
Wie sieht denn die Datei %IN_FILE% aus?
P.P.S. @Robertico
Vielen Dank für die Info. Vielleicht kann es ja jemand gebrauchen.
klar funktioniert das in Batchdateien, das Problem liegt wieder in den Leerzeichen im Pfad zur infile.dat.
Du musst ja erreichen, dass die Variable %IN_FILE% in der IN-Liste der FOR-Anweisung zuverlässig als Datei interpretiert wird und nicht als Liste von Worten.
Du kannst diesen Interpretationsschwierigkeiten auf mehrere Arten aus dem Wege gehen. Am einfachsten auf die Art, wie angeldust es skizziert hat, mit einem ('type datei') in der Klammer.
Je nachdem, ob Du Deine Variable %IN_FILE% mit oder ohne Anfürungszeichen definiert hast:
(MIT Anfü's) set infile1="C:\Dokumente und Einstellungen\Biber\infile.dat"
(OHNE Anfü's) set "infile2=C:\Dokumente und Einstellungen\Biber\infile.dat"
(OHNE Anfü's) set infile3=C:\Dokumente und Einstellungen\Biber\infile.dat
set inf ...........(Abfrage am CMD-Prompt)
infile1="C:\Dokumente und Einstellungen\Biber\infile.dat"
infile2=C:\Dokumente und Einstellungen\Biber\infile.dat
infile3=C:\Dokumente und Einstellungen\Biber\infile.dat
...Aufruf im Batch:
FOR /F "eol=; tokens=2,3* delims=, " %%i in ('type %infile1%') do echo %%i %%j %%k
..bzw.
FOR /F "eol=; tokens=2,3* delims=, " %%i in ('type "%infile2%"') do echo %%i %j %%k
FOR /F "eol=; tokens=2,3* delims=, " %%i in ('type %"infile3%"') do echo %%i %j %%k
...
HTH Biber
P.S. Ich denke nicht, dass Deine Klausel "eol=; tokens=2,3* delims=, " so sinnvoll ist.
Wie sieht denn die Datei %IN_FILE% aus?
P.P.S. @Robertico
Vielen Dank für die Info. Vielleicht kann es ja jemand gebrauchen.
Hey Biber,
in der ifile.dat steht wie in der Ausgabe beschrieben mit dem Unterschied, daß vor der Pfadangabe noch Folgendes steht:
B14 X:\pathname\datei.bat
B14 X:\pathname\datei2.ini
B14 X:\pathname\datei3.ini
B14 X:\pathname\datei4.ksh
usw
Herauskommen soll aber nur der Pfadname+Datei
Gruß Jörg
in der ifile.dat steht wie in der Ausgabe beschrieben mit dem Unterschied, daß vor der Pfadangabe noch Folgendes steht:
B14 X:\pathname\datei.bat
B14 X:\pathname\datei2.ini
B14 X:\pathname\datei3.ini
B14 X:\pathname\datei4.ksh
usw
Herauskommen soll aber nur der Pfadname+Datei
Gruß Jörg
Moin jtrumpfheller,
klar funktioniert das in Batchdateien, das
Problem liegt wieder in den Leerzeichen im
Pfad zur infile.dat.
Du musst ja erreichen, dass die Variable
%IN_FILE% in der IN-Liste der FOR-Anweisung
zuverlässig als
Datei interpretiert wird
und nicht als Liste von Worten.
Du kannst diesen
Interpretationsschwierigkeiten auf mehrere
Arten aus dem Wege gehen. Am einfachsten auf
die Art, wie angeldust es skizziert hat, mit
einem ('type datei') in der Klammer.
Je nachdem, ob Du Deine Variable %IN_FILE%
mit oder ohne Anfürungszeichen
definiert hast:
(MIT Anfü's) set
infile1="C:\Dokumente und
Einstellungen\Biber\infile.dat"
(OHNE Anfü's) set
"infile2=C:\Dokumente und
Einstellungen\Biber\infile.dat"
(OHNE Anfü's) set infile3=C:\Dokumente
und Einstellungen\Biber\infile.dat
set inf ...........(Abfrage am CMD-Prompt)
infile1="C:\Dokumente und
Einstellungen\Biber\infile.dat"
infile2=C:\Dokumente und
Einstellungen\Biber\infile.dat
infile3=C:\Dokumente und
Einstellungen\Biber\infile.dat
...Aufruf im Batch:
FOR /F "eol=; tokens=2,3* delims=,
" %%i in ('type %infile1%') do echo %%i
%%j %%k
..bzw.
FOR /F "eol=; tokens=2,3* delims=,
" %%i in ('type "%infile2%"')
do echo %%i %j %%k
FOR /F "eol=; tokens=2,3* delims=,
" %%i in ('type %"infile3%"')
do echo %%i %j %%k
...
HTH Biber
P.S. Ich denke nicht, dass Deine Klausel
"eol=; tokens=2,3* delims=, " so
sinnvoll ist.
Wie sieht denn die Datei %IN_FILE% aus?
P.P.S. @Robertico
Vielen Dank für die Info. Vielleicht
kann es ja jemand gebrauchen.
klar funktioniert das in Batchdateien, das
Problem liegt wieder in den Leerzeichen im
Pfad zur infile.dat.
Du musst ja erreichen, dass die Variable
%IN_FILE% in der IN-Liste der FOR-Anweisung
zuverlässig als
Datei interpretiert wird
und nicht als Liste von Worten.
Du kannst diesen
Interpretationsschwierigkeiten auf mehrere
Arten aus dem Wege gehen. Am einfachsten auf
die Art, wie angeldust es skizziert hat, mit
einem ('type datei') in der Klammer.
Je nachdem, ob Du Deine Variable %IN_FILE%
mit oder ohne Anfürungszeichen
definiert hast:
(MIT Anfü's) set
infile1="C:\Dokumente und
Einstellungen\Biber\infile.dat"
(OHNE Anfü's) set
"infile2=C:\Dokumente und
Einstellungen\Biber\infile.dat"
(OHNE Anfü's) set infile3=C:\Dokumente
und Einstellungen\Biber\infile.dat
set inf ...........(Abfrage am CMD-Prompt)
infile1="C:\Dokumente und
Einstellungen\Biber\infile.dat"
infile2=C:\Dokumente und
Einstellungen\Biber\infile.dat
infile3=C:\Dokumente und
Einstellungen\Biber\infile.dat
...Aufruf im Batch:
FOR /F "eol=; tokens=2,3* delims=,
" %%i in ('type %infile1%') do echo %%i
%%j %%k
..bzw.
FOR /F "eol=; tokens=2,3* delims=,
" %%i in ('type "%infile2%"')
do echo %%i %j %%k
FOR /F "eol=; tokens=2,3* delims=,
" %%i in ('type %"infile3%"')
do echo %%i %j %%k
...
HTH Biber
P.S. Ich denke nicht, dass Deine Klausel
"eol=; tokens=2,3* delims=, " so
sinnvoll ist.
Wie sieht denn die Datei %IN_FILE% aus?
P.P.S. @Robertico
Vielen Dank für die Info. Vielleicht
kann es ja jemand gebrauchen.
Moin jtrumpfheller,
dann:
- brauchst du doch Token 2 ...es sei denn, es kommen auch Pfade/Dateinamen mit Leerzeichen vor. Aber auch dann würde "tokens=2,*" reichen
- ein Komma als Delimiter ist gar nicht drin, also kann die "delims=, "-Klausel entfallen
- das "eol=;" ...na ja...ich habe auch ein paar Minuten gebraucht, um die Bedeutung dieses Features zu verstehen. Schadet aber auch nicht.
IMHO ist überdimensioniert:
FOR /F "eol=; tokens=2,3* delims=, " %%i in ('type "%infile2%"') do echo %%i %j %%k
Reichen würde sicher:
FOR /F "eol=; tokens=2,*" %%i in ('type "%infile2%"') do echo %%i %j
...
und im Normalfall (keine Pfad/Dateinamen mit Leerzeichen) sogar
FOR /F "tokens=2" %%i in ('type "%infile2%"') do echo %%i
HTH Biber
. Ich denke nicht, dass Deine Klausel "eol=; tokens=2,3* delims=, " so sinnvoll ist.
Wie sieht denn die Datei %IN_FILE% aus?
Wie sieht denn die Datei %IN_FILE% aus?
in der ifile.dat steht wie in der Ausgabe beschrieben mit dem Unterschied, daß
vor der Pfadangabe noch Folgendes steht:
B14 X:\pathname\datei.bat
B14 X:\pathname\datei2.ini
B14 X:\pathname\datei3.ini
B14 X:\pathname\datei4.ksh
vor der Pfadangabe noch Folgendes steht:
B14 X:\pathname\datei.bat
B14 X:\pathname\datei2.ini
B14 X:\pathname\datei3.ini
B14 X:\pathname\datei4.ksh
Herauskommen soll aber nur der Pfadname+Datei
dann:
- brauchst du doch Token 2 ...es sei denn, es kommen auch Pfade/Dateinamen mit Leerzeichen vor. Aber auch dann würde "tokens=2,*" reichen
- ein Komma als Delimiter ist gar nicht drin, also kann die "delims=, "-Klausel entfallen
- das "eol=;" ...na ja...ich habe auch ein paar Minuten gebraucht, um die Bedeutung dieses Features zu verstehen. Schadet aber auch nicht.
IMHO ist überdimensioniert:
FOR /F "eol=; tokens=2,3* delims=, " %%i in ('type "%infile2%"') do echo %%i %j %%k
Reichen würde sicher:
FOR /F "eol=; tokens=2,*" %%i in ('type "%infile2%"') do echo %%i %j
...
und im Normalfall (keine Pfad/Dateinamen mit Leerzeichen) sogar
FOR /F "tokens=2" %%i in ('type "%infile2%"') do echo %%i
HTH Biber
Danke Biber,
das funktioniert. Da auch im Pfadnamen Leerstellen vorkommen können, ist obige Variante sinnvoll. Und wie kriege ich es jetzt hin, die einzelnen Ergebnisse auszuwerten. Nach dem Motto:
set IN_FILE="%USERPROFILE%\infile.dat"
FOR /F "tokens=2,*" %%i in ('TYPE %IN_FILE%') do set erg1='TYPE %%i'; set erg2='TYPE %%j'; if %%erg2%%!="" (@echo %%i%%j bzw. hier wird das Programm aufgerufen); if %%erg2%%=="" (@echo %%i bzw. oder hier wird das Programm aufgerufen)
Und muß alles in einer Zeile stehen? Mit Klammern nach do (
...
)
bekomme ich Syntaxfehler.
Sorry, aber bin noch relativ newbie auf dem Gebiet
Gruß Joerg
Reichen würde sicher:
FOR /F "eol=; tokens=2,*" %%i in ('type "%infile2%"') do echo %%i %%j
FOR /F "eol=; tokens=2,*" %%i in ('type "%infile2%"') do echo %%i %%j
das funktioniert. Da auch im Pfadnamen Leerstellen vorkommen können, ist obige Variante sinnvoll. Und wie kriege ich es jetzt hin, die einzelnen Ergebnisse auszuwerten. Nach dem Motto:
set IN_FILE="%USERPROFILE%\infile.dat"
FOR /F "tokens=2,*" %%i in ('TYPE %IN_FILE%') do set erg1='TYPE %%i'; set erg2='TYPE %%j'; if %%erg2%%!="" (@echo %%i%%j bzw. hier wird das Programm aufgerufen); if %%erg2%%=="" (@echo %%i bzw. oder hier wird das Programm aufgerufen)
Und muß alles in einer Zeile stehen? Mit Klammern nach do (
...
)
bekomme ich Syntaxfehler.
Sorry, aber bin noch relativ newbie auf dem Gebiet
Gruß Joerg
Moin Jörg,
wie es der Zufall will, habe ich grad gestern in dem Beitrag Zwei Dateien vergleichen (z.B. auf Größe) nach erfolgtem Copy etwas wortreicher das Thema "Eine CMD-Anweisung in mehreren Zeilen schreiben" dargestellt.
Weitere Beispiele findest Du auch in den neueren Biber-Tutorials im Bereich Batch und Shell.
Das Semikolon wird von der CMD.exe nicht als Trennzeichen erkannt.
Am nächsten käme diesem Zeichen das Ampersand "&", mit dem sich mehrere Anweisungen in einer Zeile unterbringen lassen
Beispiel ist mein Standard-Eröffnungssatz im Batch :"@echo off & setlocal"
Bei mehreren SET-Anweisungen solltest Du Klammern verwenden, um eine eindeutige Interpretation sicherzustellen.
Bsp..
(Set "VarA=%%i") & (Set "VarB=%%j") ........ist eindeutig.
Set VarA=%%i & Set VarB=%%j ........ist für Mensch und CMD-Interpreter gleichermaßen missverständlich.
*
Sinngemäß sollte Deine FOR..IN..DO-Anweisung so aussehen:
FOR /F "tokens=2,*" %%i in ('TYPE %IN_FILE%') do (
set erg1='TYPE %%i'
set erg2='TYPE %%j'
)
Also jede Anweisung in eine neue Zeile - ist am lesbarsten.
Die öffnende Klammer sollte am Ende der Zeile "FOR...IN..DO (" sein
Und zur Lesbarkeit die Klammer-Zu in einer eigenen Zeile am Ende.
HTH Biber
wie es der Zufall will, habe ich grad gestern in dem Beitrag Zwei Dateien vergleichen (z.B. auf Größe) nach erfolgtem Copy etwas wortreicher das Thema "Eine CMD-Anweisung in mehreren Zeilen schreiben" dargestellt.
Weitere Beispiele findest Du auch in den neueren Biber-Tutorials im Bereich Batch und Shell.
Das Semikolon wird von der CMD.exe nicht als Trennzeichen erkannt.
Am nächsten käme diesem Zeichen das Ampersand "&", mit dem sich mehrere Anweisungen in einer Zeile unterbringen lassen
Beispiel ist mein Standard-Eröffnungssatz im Batch :"@echo off & setlocal"
Bei mehreren SET-Anweisungen solltest Du Klammern verwenden, um eine eindeutige Interpretation sicherzustellen.
Bsp..
(Set "VarA=%%i") & (Set "VarB=%%j") ........ist eindeutig.
Set VarA=%%i & Set VarB=%%j ........ist für Mensch und CMD-Interpreter gleichermaßen missverständlich.
*
Sinngemäß sollte Deine FOR..IN..DO-Anweisung so aussehen:
FOR /F "tokens=2,*" %%i in ('TYPE %IN_FILE%') do (
set erg1='TYPE %%i'
set erg2='TYPE %%j'
)
Also jede Anweisung in eine neue Zeile - ist am lesbarsten.
Die öffnende Klammer sollte am Ende der Zeile "FOR...IN..DO (" sein
Und zur Lesbarkeit die Klammer-Zu in einer eigenen Zeile am Ende.
HTH Biber