Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Text nach einem Schlüsselwort als Variable setzen

Frage Entwicklung Batch & Shell

Mitglied: 91183

91183 (Level 1)

08.02.2011 um 06:00 Uhr, 2847 Aufrufe, 6 Kommentare

Hallo!

Ich bin es schon wieder.

Diese Frage bezieht sich auf eine andere Frage / einen anderen Beitrag von mir.
Ich bin allerdings der Meinung, dass diese Frage / dieses Problem einen
eigenen Beitrag verdient, da sie / es doch leicht abweicht und andere Ergebnisse liefern soll.

Letztes Wort der aktuellsten Datei als Variable setzen

Ich würde gerne wissen, was ich an dem folgenden Skript abändern muss,
damit dieses nicht mehr das letzte Wort in der letzten Zeile als Variable setzt,
sondern stattdessen in der letzten Zeile der Datei nach einem Schlüsselwort sucht
(Beispiel: "$$$start") und alle Wörter und Leerzeichen die danach folgen als Variable übernimmt.
Einzige Ausnahme hierbei müsste das Leerzeichen nach dem Schlüsselwort sein.



Erstmal das zu ändernde Skript (noch mal DANKE an bastla):

01.
@echo off & setlocal 
02.
set "pfad=%userprofile%\eigene dateien\logs\" 
03.
 
04.
pushd "%pfad%" 
05.
for /f "delims=" %%i in ('dir /b /on "Idee*.txt" 2^>nul') do set "NeuesteDatei=%%i" 
06.
for /f "delims=" %%i in ('type "%NeuesteDatei%"') do set "Zeile=%%i" 
07.
setlocal enabledelayedexpansion 
08.
for %%i in (!Zeile!) do set "Letztes=%%i" 
09.
endlocal & set "Letztes=%Letztes%" 
10.
popd 
11.
 
12.
echo %Letztes%

Ich schätze mal, es müsste nur Zeile 8 geändert werden. Aber ich habe keine Ahnung in was.



Auszulesende Datei als Beispiel: "Idee_20110206_221259"

01.
 
02.
 
03.
--------------------------------------------------------------- 
04.
 
05.
  Kanal ID:      (('id', 1884537),) 
06.
  Kanal Name:    Kanal246 
07.
  Benutzername:       Username 
08.
  Gestartet am / um: 2011.02.06 22:12:59 
09.
--------------------------------------------------------------- 
10.
 
11.
[ 2011.02.06 22:14:19 ] Programm > Text1 
12.
[ 2011.02.06 22:15:06 ] Programm > Text2 
13.
[ 2011.02.06 22:15:11 ] User > U-Text1 
14.
[ 2011.02.06 22:15:15 ] User > $$$start chkdsk C: /F 
15.
 


Ablauf (quasi fast genau wie bei dem anderen Beitrag)

Batch-Datei sucht sich die letzte Beschriebene Zeile (hier Zeile 14) und überprüft diese nach dem Wort "$$$start".
Sofern dieses vorhanden ist, werden alle Wörter und Zeichen (Ausnahme: das Leerzeichen nach dem Schlüsselwort)
nach "$$$start" als Variable gesetzt. Also sollte die Variable (%var%) in diesem Beispiel so aussehen: "%var%=chkdsl C: /F"


Danke im Voraus und entschuldigt bitte, dass ich Euch schon wieder Arbeit mache.
Gruß Xeno
Mitglied: bastla
08.02.2011 um 08:27 Uhr
Hallo Xeno--!

Versuch es ab Zeile 7 so :
01.
set "Such=$$$start" 
02.
echo "%Zeile%"|findstr "%Such%">nul || goto :NichtVorhanden 
03.
setlocal enabledelayedexpansion 
04.
set "var=!Zeile:*%Such% =!" 
05.
endlocal & set "var=%var%" 
06.
popd 
07.
 
08.
echo %var%
Für den Fall, dass es den Suchstring nicht in der letzten Zeile gibt, musst Du noch die Zeile 2 Deinen Bedürfnissen anpassen ...

Grüße
bastla

P.S.:
... entschuldigt bitte, dass ich Euch schon wieder Arbeit mache.
Wir suchen doch richtiggehend danach ...
Bitte warten ..
Mitglied: 91183
08.02.2011 um 23:14 Uhr
Jop, hat geklappt.

Das "goto :NichtVorhanden" habe ich schon gleich beim schreiben geändert.

Danke!!!


Wo es mir gerade noch einfällt.

Gibt es die Möglichkeit mit einem ähnlichen Befehl eine Config-Datei auszulesen und die Zeilen zu vergleichen?
Dieser Teil bezieht sich auch wieder auf die vorherige Frage:

Und zwar wird ja mit diesem Skript das letzte Wort in der (vor)letzten Zeile der aktuellsten Datei gesucht
(Skript A):


01.
@echo off & setlocal 
02.
set "pfad=%userprofile%\eigene dateien\logs\" 
03.
 
04.
pushd "%pfad%" 
05.
for /f "delims=" %%i in ('dir /b /on "Idee*.txt" 2^>nul') do set "NeuesteDatei=%%i" 
06.
for /f "delims=" %%i in ('type "%NeuesteDatei%"') do set "Zeile=%%i" 
07.
setlocal enabledelayedexpansion 
08.
for %%i in (!Zeile!) do set "Letztes=%%i" 
09.
endlocal & set "Letztes=%Letztes%" 
10.
popd 
11.
 
12.
echo %Letztes%

... und ich hatte im anderen Beitrag geschrieben, dass das letzte Wort (die Variable %Letztes%)
erst später verglichen werden soll:


Das Wort (egal welches) soll nur als Variable gesetzt
werden, damit es hinterher verglichen werden kann. Beispiel:

Letztes Wort (if %var%=) "$$$Internet", . . . (goto) Firefox starten
Letztes Wort (if %var%=) "$$$E-Mail", . . . (goto) ist wohl klar
Letztes Wort (if %var%=) "$$$Explorer" . . . (goto) auch klar
usw.

Nur wenn das Wort abweicht soll er zum Anfang (goto Anfang) zurückkehren und eben alles noch einmal machen. Bis irgendwann
vielleicht mal ein Wort auftaucht das passt.
Aber das nur so am Rande.


Also habe ich hinterher angefangen die if-Befehle einzubauen, um das Wort zu vergleichen.
Hier mal ein Beispiel (Skript B):


01.
if %Letztes%==$$$fire goto Firefox 
02.
if %Letztes%==$$$vlc goto VLC 
03.
if %Letztes%==$$$abi goto AbiWord 
04.
if %Letztes%==$$$auda goto Audacity 
05.
if %Letztes%==$$$clam goto Clamwin 
06.
if %Letztes%==$$$file goto FileZilla 
07.
if %Letztes%==$$$7 goto 7-Zip 
08.
if %Letztes%==$$$deep goto DeepBurner 
09.
goto END 
10.
 
11.
:Firefox_A 
12.
echo Firefox starten 
13.
start FirefoxPortable\FirefoxPortable.exe 
14.
 
15.
:VLC 
16.
::.... 
17.
::.... 
18.
::.... 
19.
::usw. eben. 
20.
 

Jetzt habe ich mich gefragt, ob man das nicht auch einfacher über eine Config-Datei (Name: Idee_config.txt)
vergleichen könnte. Diese würde dann ungefähr so aussehen (Skript C):


01.
Pfad			%userprofile%\eigene dateien\logs\ 
02.
Datei			Idee* 
03.
 
04.
------------------------------------------------------------------ 
05.
 
06.
$$$fire			start FirefoxPortable\FirefoxPortable.exe 
07.
$$$vlc			start Z:\VLCPalyer\VLC.exe 
08.
$$$abi			abi\abiword.exe 
09.
$$$irgendwas		.......... 
10.
$$$irgendwas2		.......... 
11.
$$$chk			chkdsk C: /F 
12.
$$$copy			copy Ordner-A\Text.txt Ordner-B\Text.txt 
13.
$$$dir			cd "ein Ordner" & dir 
14.
 
15.
usw. 
16.
 

(In diesem Beispiel bezieht sich Zeile 1 auf Skript A, Zeile 2)
(Zeile 2 aus Skript C bezieht sich auf Skript A, Zeile 5)
(Getrennt werden die Spalten A und B im Skript C durch mehrere Tab-Abstände, falls das wichtig sein sollte)




Ablauf wäre dann folgender:

Der if-Befehl vergleicht die Variable %Letztes% mit den Wörtern in der ersten Spalte der Config-Datei (Skript C)...
Ausnahme wären natürlich die Wörter "Pfad" und "Datei". Wobei es wahrscheinlich einfacher wäre,
nur die Wörter aus ersten Spalte zu berücksichtigen, die mit $$$ anfangen und diese dann mit %Letztes% zu vergleichen.
... und sofern eines der Wörter mit %Letztes% übereinstimmt, wird der Befehl ausgeführt der in der zweiten Spalte steht.



Als Beispiel bezogen auf Skript C:

if %Letztes% == %$$$Wort_aus_Spalte_1% dann führe %Befehl_aus_Spalte_2% aus.

... wäre dann:

if %Letzes% == "$$$chk" dann führe "chkdsk C: /F" aus

Nur so als Beispiel. Ist natürlich kein korrekter Befehl.




Ach so, Skript A müsste so abgeändert werden, dass es in Zeile 2...

01.
set "pfad=%userprofile%\eigene dateien\logs\"
...nach dem Wort "Pfad" in der ersten Spalte der Config-Datei (Skript C) sucht und dann den Pfad aus Spalte 2 übernimmt.


Das Gleiche gilt natürlich auch für die 5te Zeile von Skript A.

01.
for /f "delims=" %%i in ('dir /b /on "Idee*.txt" 2^>nul') do set "NeuesteDatei=%%i"
Diese müsste dann nach dem Wort "Datei" suchen . . . . . usw.

So . . . wieder einen halben Roman geschrieben.

Danke im Voraus
Gruß Xeno
Bitte warten ..
Mitglied: bastla
08.02.2011 um 23:26 Uhr
Hallo Xeno--!

Das Auslesen würde ich jeweils mit "findstr" erledigen - also zB:
01.
set "Conf=D:\Idee_config.txt" 
02.
for /f "tokens=1*" %%i in ('findstr /b "Pfad" "%Conf%"') do set "Pfad=%%j"
Etwas kontrollierter wäre:
01.
set "Conf=D:\Idee_config.txt" 
02.
set "Pfad=" 
03.
for /f "tokens=1*" %%i in ('findstr /b "Pfad" "%Conf%"') do set "Pfad=%%j" 
04.
if not defined Pfad echo Pfad nicht gefunden & goto :ConfigFehler
Nach dem selben Schema:
for /f "tokens=1*" %%i in ('findstr /b /L "%LetztesWort%" "%Conf%"') do %%j
oder
01.
set "Aktion=" 
02.
for /f "tokens=1*" %%i in ('findstr /b /L "%LetztesWort%" "%Conf%"') do set "Aktion=%%j" 
03.
if not defined Aktion ... 
04.
%Aktion%
[Edit] Das "Sicherheits-/L" (damit "$" auf keinen Fall als Zeilenende-Kennzeichen interpretiert wird, braucht's wohl nicht - wenn's ja eh vorneweg steht) ... [/Edit]

Grüße
bastla

P.S.: Deine "Romane" lese ich gerne - insbesondere im Vergleich zu vielen anderen "Problemstellungen" hier, bei denen nach der dritten Nachfrage noch immer mehr im Nebel als bereits erkennbar ist ...
Bitte warten ..
Mitglied: 91183
09.02.2011 um 01:02 Uhr
Hallo.


Danke und DANKE.

Morgen werde ich das mal ausprobieren. Gebe Dir dann eine Rückmeldung.

Bis dann.



Gruß Xeno
Bitte warten ..
Mitglied: 91183
09.02.2011 um 02:46 Uhr
Hallo.

Ich konnte jetzt doch nicht umhin das Skript einmal zu testen.
Habe es aber noch nicht in die richtige .bat eingebaut sondern die Teile
einfach nur mal in einer neuen Batch getestet.


Also, der erste Teil mit dem erkennen des Pfades / Datei...

01.
set "Conf=D:\Idee_config.txt" 
02.
set "Pfad=" 
03.
for /f "tokens=1*" %%i in ('findstr /b "Pfad" "%Conf%"') do set "Pfad=%%j" 
04.
if not defined Pfad echo Pfad nicht gefunden & goto :ConfigFehler
...hat super funktioniert.


Allerdings habe ich mit dem zweiten Teil...

01.
set "Aktion=" 
02.
for /f "tokens=1*" %%i in ('findstr /b /L "%LetztesWort%" "%Conf%"') do set "Aktion=%%j" 
03.
if not defined Aktion echo Aktion nicht gefunden & goto :ConfigFehler 
04.
%Aktion%
... ein kleines Problem. Wie hier (zwischen den beiden Trennstrichen) schon erwähnt ...

Der if-Befehl vergleicht die Variable %Letztes% mit den Wörtern in der ersten Spalte der Config-Datei (Skript C)...
Ausnahme wären natürlich die Wörter "Pfad" und "Datei". Wobei es wahrscheinlich einfacher
wäre,
nur die Wörter aus ersten Spalte zu berücksichtigen, die mit $$$ anfangen und diese dann mit %Letztes% zu vergleichen.
... und sofern eines der Wörter mit %Letztes% übereinstimmt, wird der Befehl ausgeführt der in der zweiten Spalte
steht.

...soll das Skript (zum vergleichen des letzten Wortes) NICHT
"%userprofile%\eigene dateien\logs\" bzw. "Idee*" als Aktion setzen,
wenn die Variable (%Letzte%) gleich "Pfad" bzw. "Datei" ist. Gut, dass würde in
dieser Beispiels-Config-Datei...


01.
Pfad			%userprofile%\eigene dateien\logs\ 
02.
Datei			Idee* 
03.
 
04.
------------------------------------------------------------------ 
05.
 
06.
$$$fire			start FirefoxPortable\FirefoxPortable.exe 
07.
$$$vlc			start Z:\VLCPalyer\VLC.exe 
08.
$$$abi			abi\abiword.exe 
09.
$$$irgendwas		.......... 
10.
$$$irgendwas2		.......... 
11.
$$$chk			chkdsk C: /F 
12.
$$$copy			copy Ordner-A\Text.txt Ordner-B\Text.txt 
13.
$$$dir			cd "ein Ordner" & dir 
14.
 
15.
usw. 
16.
 

.... nicht viel ausmachen aber in anderen Dateien vielleicht schon.
Deswegen habe ich den zweiten Teil Deines Skripts so abgeändert....


01.
@echo off & setlocal 
02.
 
03.
set "Config=Idee_config.txt" 
04.
set "Letztes=$$$fire" 
05.
 
06.
set "Aktion=" 
07.
for /f "tokens=1*" %%i in ('findstr /b /L "§%Letztes%" "%Config%"') do set "Aktion=%%j" 
08.
if not defined Aktion echo Nicht gefunden & pause & exit 
09.
 
10.
 
11.
echo %Aktion% 
12.
 
13.
 
14.
pause
(Zeile 4 nur um die Suche nach dem letzten Wort zu simulieren)
(Änderung in Zeile 7)


... und die Config-Datei so:


01.
Pfad			%userprofile%\eigene dateien\logs\ 
02.
Datei			Idee* 
03.
 
04.
------------------------------------------------------------------ 
05.
 
06.
§$$$fire			start FirefoxPortable\FirefoxPortable.exe 
07.
§$$$vlc			start Z:\VLCPalyer\VLC.exe 
08.
§$$$abi			abi\abiword.exe 
09.
§$$$irgendwas		.......... 
10.
§$$$irgendwas2		.......... 
11.
§$$$chk			chkdsk C: /F 
12.
§$$$copy			copy Ordner-A\Text.txt Ordner-B\Text.txt 
13.
§$$$dir			cd "ein Ordner" & dir 
14.
 
15.
usw. 
16.
 

Dadurch sucht das Skript nur noch nach Wörter mit einem § davor. Sprich, wenn
in diesem Fall "§%Letztes%==Pfad" bzw. Datei", würde er nicht mehr
"%userprofile%\eigene dateien\logs\" bzw. "Idee*" auswerfen, da er ja in der
Config-Datei nach dem Wort "§Pfad" suchen würde. Es dieses da aber nicht gibt.


Ist die einzige Methode, die mir auf die Schnelle eingefallen ist.
Schätze mal, Du kennst eine bessere Lösung.



Gruß Xeno
Bitte warten ..
Mitglied: bastla
09.02.2011 um 08:13 Uhr
Hallo Xeno--!

Kannst Du so machen ...

Alternative: Da ja die drei "$" als Kennzeichen dienen können, einfach vorweg danach filtern:
for /f "tokens=1*" %%i in ('findstr /b /L "$$$" "%Config%"^|findstr /b "%Letztes%"') do set "Aktion=%%j"
Der Übersichtlichkeit halber könntest Du natürlich auch für "$$$" eine Variable verwenden.

Grüße
bastla

P.S.: "exit" ist für mich nur zusammen mit einem "/b" sinnvoll - ansonsten tut's eigentlich auch ein "goto :eof" (und das schließt mir beim Testen das CMD-Fenster nicht )
Bitte warten ..
Neuester Wissensbeitrag
Microsoft

Lizenzwiederverkauf und seine Tücken

(5)

Erfahrungsbericht von DerWoWusste zum Thema Microsoft ...

Ähnliche Inhalte
Batch & Shell
Variable setzen können während timeout (3)

Frage von DontFlameMeITryMyBest zum Thema Batch & Shell ...

Batch & Shell
gelöst Selected Gridview Value in Variable schreiben (4)

Frage von reissaus73 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (17)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Windows Netzwerk
Windows 10 RDP geht nicht (16)

Frage von Fiasko zum Thema Windows Netzwerk ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...