sonoflithium
Goto Top

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 face-sad
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)

Content-Key: 10894

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

Printed on: April 20, 2024 at 03:04 o'clock

Mitglied: 11078
11078 May 19, 2005 at 19:09:19 (UTC)
Goto Top
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

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
Mitglied: 13100
13100 May 20, 2005 at 01:00:41 (UTC)
Goto Top
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.
Member: sonoflithium
sonoflithium May 20, 2005 at 09:59:09 (UTC)
Goto Top
Danke für die Antwort!

@tim
Es sind Kästchen... ist eine Borland Konfigurationsdatei... weiss auch nicht warums ausgerechnet kästchen sind. Leider kann der Pfad unter Umständen GANZ woanders stehen und: Es kann mehrere davon geben.

@13100
Das kommt dem ganzen schon sehr nahe! ich denke damit bekomm ichs hin, danke!
Mitglied: 13100
13100 May 20, 2005 at 10:58:21 (UTC)
Goto Top
die kästchen sind mit sehr hoher wahrscheinlichkeit
tabulatoren die lediglich falsch angezeigt werden.
das format wird allseits gern als "tabstop getrennte
textdatei" bezeichnet.
Member: sonoflithium
sonoflithium May 23, 2005 at 15:26:19 (UTC)
Goto Top
Scheinen Trennzeichen zu sein, z. Glück gehts aber auch anders einfacher...
Aber: Meine gewonnenen Parameter muss ich noch in einer Exe eingeben, was natürlich automatisch funktionieren sollte.
Muster:
%javart%\bin\keytool.exe -genkey -alias tomcat -keyalg RSA -keystore %cd%\SSLkey.keystore
<----Aufruf der Exe-Datei
Nun müsste man manuelle Eingaben machen, die Werte hiefür habe ich aber in der *.bat, wie kann ich diese Werte übergeben / die Eingaben automatisieren??
Member: Robertico
Robertico Sep 19, 2005 at 18:31:02 (UTC)
Goto Top
Das Thema ist genau das was ich suche.

Habe einen EXE-Namen und muß nun wissen in welchem Pfad diese installiert wurde. Aus den Beiträgen kann ich das nicht heraus lesen.
Member: jtrumpfheller
jtrumpfheller Jan 31, 2006 at 16:32:11 (UTC)
Goto Top
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
Member: Biber
Biber Jan 31, 2006 at 19:00:03 (UTC)
Goto Top
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.
Member: jtrumpfheller
jtrumpfheller Jan 31, 2006 at 23:20:25 (UTC)
Goto Top
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

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.
Member: Biber
Biber Feb 01, 2006 at 08:56:06 (UTC)
Goto Top
Moin jtrumpfheller,

. Ich denke nicht, dass Deine Klausel "eol=; tokens=2,3* delims=, " so sinnvoll ist.
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

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
Member: jtrumpfheller
jtrumpfheller Feb 01, 2006 at 10:12:22 (UTC)
Goto Top
Danke Biber,

Reichen würde sicher:
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 face-smile

Gruß Joerg
Member: Biber
Biber Feb 01, 2006, updated at Oct 18, 2012 at 15:56:36 (UTC)
Goto Top
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