holsthn
Goto Top

Verknüpfungen aus Services erstellen bzw. Eine Textdatei Zeilenweise verarbeiten und Variablen ableiten

Ich habe eine Datei erstellt, die mir Verknüpfungen baut. Leider komme ich mit Schleifen nicht wirklich klar, glaube aber für meine Aufgabe komme ich nicht drumrum eine zu nutzen.

Hi
Ich habe eine Batch-Datei erstellt die mir Verknüpfungen mit verschiedenen Abhängigkeiten erstellt.
In meiner Datei werden die Varibalen leider noch direkt eingegeben. Dies soll sich ändern - ich würde die Variablen gern mit Werten aus der services füllen.

Hier erstmal was ich bis jetzt habe:

 
@echo off & setlocal

::ausgelesene Werte aus services

::Version der Datenbank 
::0-1 in jeder Zeile von services
set "DBVers=6"   
::Version des ServicePacks 
::1-3 in jeder Zeile von services
set "DBSP=01"   
::Name der Datenbank 
::3-erste Leertaste oder Tabstop in jeder Zeile von services
set "DBName=BeispielDatenbankTest"   
::tcp-port 
::erste Ziffer nach einem oder mehreren Leerschritten oder Tabstops bis /
::in jeder Zeile von services 
set "DBPort=2437"   


::Erstellung der Werte für Verknüpfung

::IP des Datenbankservers
echo %DBName%|findstr /c:"Test">nul  
IF %errorlevel%==0 (
	set "DBIP=192.168.42.209"  
) ELSE (
	set "DBIP=192.168.42.205"  
)

::Speicherort der Verknüpfung
echo %DBName%|findstr /c:"Test">nul  
IF %errorlevel%==0 (
	set "zielpfad=%userprofile%\Desktop\Symbolleisten\Test"  
) ELSE (
	set "zielpfad=%userprofile%\Desktop\Symbolleisten\Entwicklung"  
)
IF %DBNAME% EQU Beispielausnahme1 (set "zielpfad=%userprofile%\Desktop\Symbolleisten\")  
IF %DBNAME% EQU Beispielausnahme2 (set "zielpfad=%userprofile%\Desktop\Symbolleisten\")  
  
::Name der Verknüpfung (ohne ".lnk")   
set "progtitel=%DBvers%.%DBSP%%DBname%"    
::Speicherort der Programmdatei (wird auch für "Ausführen in:" verwendet)   
set "progdir=%ProgramFiles%\NAV\%DBvers%.%DBSP%"    
set "progexe=fin.exe"   
::Kommentar  
set "beschreibung=Erklärung eigentlich unnötig ..."    
  
::Bei Bedarf Speicherordner der Verknüpfung erstellen (siehe oben "zielpfad"):   
if not exist "%zielpfad%" md "%zielpfad%"    
  
::temporäres VBScript erzeugen ...  
echo Set objShell=WScript.CreateObject("Wscript.Shell")>%temp%\MakeShortCut.vbs    
echo Set objShortcut=objShell.CreateShortcut("%zielpfad%\%progtitel%.lnk")>>%temp%\MakeShortCut.vbs    
echo objShortcut.TargetPath=("%progdir%\%progexe%")>>%temp%\MakeShortCut.vbs   
echo objShortCut.Arguments=(" id=%DBVers%%DBName%, servername=%DBIP%:%DBPort%, nettype=tcp")>>%temp%\MakeShortCut.vbs   
echo objShortcut.Description="%beschreibung%">>%temp%\MakeShortCut.vbs    
echo objShortcut.WorkingDirectory="%progdir%">>%temp%\MakeShortCut.vbs    
echo objShortcut.Save>>%temp%\MakeShortCut.vbs  
  
::... ausführen ...  
cscript //nologo %temp%\MakeShortCut.vbs  
  
::... und wieder löschen.  
del %temp%\MakeShortCut.vbs

Im ersten Block meiner Datei steht schon ausgelesene Werte aus services und vor den jeweiligen sets, wo dies in der services zu finden ist, z.B. 0-1 in jeder Zeile von services

Ein Beispiel für die Datei services:
 
# Copyright (c) 1993-2004 Microsoft Corp.
#
# Diese Datei enthält die Portnummern für bekannte Dienste gemäß IANA.
#
# Format:
#
# <Dienstname>  <Portnummer>/<Protokoll>  [Alias...]   [#<Kommentar>]

dccm             5679/tcp                           #Direct Cable Connect Manager
ms-licensing     5720/tcp                           #Microsoft Licensing
ms-licensing     5720/udp                           #Microsoft Licensing 
directplay8      6073/tcp                           #DirectPlay8
directplay8      6073/udp                           #DirectPlay8
man              9535/tcp                           #Remote Man Server
rasadv           9753/udp
imip-channels   11320/tcp                           #IMIP Channels Port
directplaysrvr  47624/tcp                           #Direct Play Server
directplaysrvr  47624/udp                           #Direct Play Server

# NAVStart
402BeispielTest	  2433/tcp			    # 402 
402Beispiel1Test  2435/tcp			    # 402 
402Beispiel2Test  2436/tcp			    # 402
403Beispiel4711Test 2444/tcp			    # 403

601Beispieltest   2438/tcp	                    # 601 
601Beispiel	  2439/tcp			    # 601 	

Was ich jetzt möchte:
Eine Schleife soll NAVStart suchen und in die nächste Zeile gehen. Das erste Zeichen - im Bsp. in der ersten Zeile nach NAVStart >4< - soll in der Variable DBVers gespeichert werden. Zeichen 2 und 3 soll in den Variable DBSP gespeichert werden, Zeichen 4 bis erstes Leerzeichen oder erster Tabstopp in Variable DBName und erste Ziffer nach einem oder mehreren Leerzeichen oder Tabstops bis / in DBPort.
Das ganze soll dann meine Verknüpfung erstellen und mit der nächsten Zeile forfahren. Hier sollen wieder die Variablen mit den jeweiligen Werten gefüllt und eine nächste Verknüpfung erstellt werden.
Dies soll sich fortsetzen bis zur letzten Zeile.

Ich denke, das ist keine besonders schwere Aufgabe, aber ich komme mit den for-Schleifen einfach nicht wirklich klar..

Wäre für Hilfe sehr dankbar.

Viele Grüße

Content-Key: 161222

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

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

Member: Friemler
Friemler Feb 21, 2011 at 13:04:28 (UTC)
Goto Top
Hallo holsthn,

probiere mal folgendes Skript:
@echo off

setlocal

set "Services=Services.txt"  

for /f "delims=:" %%l in ('findstr /i /n /c:"NAVStart" "%Services%"') do (  
  set "BegLine=%%l"  
)

for /f "usebackq skip=%BegLine% tokens=1-2 delims=	/ " %%a in ("%Services%") do (  
  set "Part1=%%a"  
  set "Part2=%%b"  
  call :ProcessLine
)

exit /b


:ProcessLine
  set "DBVers=%Part1:~0,1%"  
  set "DBSP=%Part1:~1,2%"  
  set "DBName=%Part1:~3%"  
  set "DBPort=%Part2%"  

  REM Hier der Code, der die Verknüpfung erzeugt
  REM Die ECHO-Befehle sind nur zur Kontrolle
  echo %DBVers%
  echo %DBSP%
  echo %DBName%
  echo %DBPort%
exit /b
In Zeile 11 das erste Zeichen nach dem Gleichheitszeichen von delims ist ein Tab-Zeichen (ASCII-Code 9).

Die erste FOR-Schleife sucht die Zeile mit NAVStart und speichert deren Zeilenummer in der Variablen BegLine. Ab der Zeile danach wird von der zweiten FOR-Schleife die Services.txt zeilenweise ausgelesen und in Tokens zerlegt (Trennzeichen sind Tab, / und Leerzeichen). Die Tokens werden den Variablen Part1 und Part2 zugewiesen und das Unterprogramm ProcessLine aufgerufen. Dort wird Part1 in seine Bestandteile zerlegt.

Gruß
Friemler
Member: pieh-ejdsch
pieh-ejdsch Feb 21, 2011 at 13:34:53 (UTC)
Goto Top
Member: holsthn
holsthn Feb 21, 2011 at 16:20:02 (UTC)
Goto Top
Hi
Vielen Dank für die schnelle Antwort!
Habe das jetzt mal getestet und kriege leider nach call:Processline nen Fehler.
Um zu verdeutlichen was ich meine hier einfach mal meine DOS-Ausgabe, wenn ich das @echo off rausnehme
C:\Users\haho\Desktop>set "Services=\\srv\netlogon\services"  

C:\Users\haho\Desktop>for /F "delims=:" %l in ('findstr /i /n /c:"NAVStart"  
"\\srv\netlogon\services"') do (set "BegLine=%l" )  

C:\Users\haho\Desktop>for /F "tokens=1-2 delims=    / " %a in ('more + "\\srv\netlogon\services"') do (  
set "Part1=%a"  
 set "Part2=%b"  
 call :ProcessLine
)
Auf die Datei C:\Users\haho\Desktop\+ kann nicht zugegriffen werden.
C:\Users\haho.BGL\Desktop>exit /b

noch ne Idee?

Viele Grüße
Member: Friemler
Friemler Feb 21, 2011 at 16:44:15 (UTC)
Goto Top
Hallo holsthn,

Du hast meine erste Version des Scripts verwendet (mit MORE im Kopf der zweiten FOR-Schleife) und dabei wohl auch einen Tippfehler gemacht. Nimm mal die aktuelle Version von oben.

[EDIT]
Das obige Fehlerbild kann eigentlich nur auftreten, wenn die Variable BegLine nicht definiert ist, was wiederum nur der Fall sein kann, wenn der String NAVStart in Deiner Services.txt nicht gefunden wurde. BTW: Hast Du die Variable Services in Zeile 5 angepasst? Sie sollte den Pfad zu Deiner "Services.txt" (oder nur "Services"?) enthalten.
[/EDIT]

Gruß
Friemler
Member: holsthn
holsthn Feb 21, 2011 at 17:51:12 (UTC)
Goto Top
Hi,
peinlich, dass ich oben so genau bin bei der Beschreibung und dann selbst son Fehler mache...
Schuldigung! In meiner Datei stand nicht NAVStart, sondern NAV Start...
Vielen Dank für die Hilfe und wie gesagt sorry, dass Du jetzt noch nach meinem Fehler suchen musstest.
Viele Grüße!
Member: Friemler
Friemler Feb 21, 2011 at 18:18:02 (UTC)
Goto Top
Hi holsthn,

und wo bleibt der grüne Haken? face-wink

Gruß
Friemler