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:
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:
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 161222
Url: https://administrator.de/contentid/161222
Ausgedruckt am: 22.11.2024 um 16:11 Uhr
6 Kommentare
Neuester Kommentar
Hallo holsthn,
probiere mal folgendes Skript:
In Zeile 11 das erste Zeichen nach dem Gleichheitszeichen von
Die erste
Gruß
Friemler
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
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
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
[/EDIT]
Gruß
Friemler
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