opachl
Goto Top

Per batch mehrere Werte aus text lesen Möglich ?

Ich möchte aus einer Textdatei deren Name nich konstant ist Werte auslesen.
Der Name der txt datei ist wie folgt Aufgebaut:

PCName-Tag-monat-Jahr (ich möchte immer das Neuste verwenden)
Der Inhalt lautet:

Name=Server1
Ip=xx.x.xxx.xxx


Nun habe ich 10 verschiedene Pc´s somit auch jeden tag 10 txt datein.
Das root Verzeichniss aller txt datein ist "C:\ipsammlung" (es liegen alle 10 datein auf einem pc)
Was ich nun möchte ist

Eine Auflistung aller PC mit ip und auswahl per batch
:index
----------------------------------------------------------------------------------
Nr          Name                                         IP

1            Server1                                      xx.x.xxx.xxx
2            ServerB                                      xx.x.xxx.xxx

usw

-----------------------------------------------------------------------------------
Zum besseren Verständniss

Es soll später ca so ausehen:
if /I "%auswahl%"=="1" (  
echo 1
goto :PC1
)

if /I "%auswahl%"=="2" (  
echo 2
goto :PC2
)

:PC1
net send (variable der ip) Meine Meldung
goto index

:PC2
net send (variable der ip nr 2) Meine Meldun
goto index
Wenn es möglich ist so wie ich mir es denke
Danke schon mal im Voraus
mfg Opachl

Content-Key: 71532

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

Printed on: April 16, 2024 at 12:04 o'clock

Member: bastla
bastla Oct 21, 2007 at 22:08:36 (UTC)
Goto Top
Hallo Opachl und willkommen im Forum!

Zu Deiner Frage muss ich vorweg einmal Biber zitieren: Alles außer Brotschneiden geht mit Batch.
Ob das mit dem Brotschneiden immer noch gilt, können wir ihn ja mal fragen ... face-wink

Ein erster Entwurf könnte so aussehen:
@echo off & setlocal enabledelayedexpansion
set "Quelle=C:\ipsammlung"  
set /a Anz=0
for %%d in ("%Quelle%\*.txt") do call :AddLine "%%d"  

:Menue
cls
echo Nr Name       IP
echo.
for /l %%i in (1,1,%Anz%) do echo %%i  !Name%%i!  !IP%%i!
echo.
echo 0 Beenden
echo.
echo.

set Auswahl=
set Auswahl2=
set /p "Auswahl=Rechnernummer: "  

if not defined Auswahl goto :AuswahlFehler
set /a Auswahl2=%Auswahl% 2>nul
if not defined Auswahl2 goto :AuswahlFehler
if %Auswahl% neq %Auswahl2% goto :AuswahlFehler
set /a Auswahl=%Auswahl2%
if %Auswahl%==0 goto :eof
if %Auswahl% lss 1 goto :AuswahlFehler
if %Auswahl% gtr %Anz% goto :AuswahlFehler

echo.
echo %Auswahl%
echo net send !IP%Auswahl%! Meine Meldung
echo Gesendet an !Name%Auswahl%!

:Weiter
echo.
echo.
pause
goto :Menue

:AuswahlFehler
echo.
echo Bitte nur eine Zahl von 0 bis %Anz% eingeben
goto :Weiter

:AddLine
set /a Anz+=1
for /f "usebackq delims=" %%i in (%1) do set %%i  
set "Name%Anz%=%Name%"  
set "IP%Anz%=%IP%"  
goto :eof
Die Dateiauswahl habe ich für den Moment eingespart (auch, da mir nicht ganz klar ist, ob es etwa genügen würde, einfach die 10 neuesten Dateien nach Änderungsdatum zu verwenden) - es werden einfach alle Textdateien des Quellordners gelesen (daher zum Testen nur die jeweils passenden dort ablegen), wobei ich natürlich voraussetze, dass alle Textdateien die von Dir beschriebene Struktur aufweisen.

Der Test, ob eine getroffene Auswahl eine Zahl ist, wurde neulich hier besprochen: In Batch Datei eine Prüfung einbauen, ob ein Wert eine Zahl ist
Wasserdicht ist die Absicherung der Eingabe damit natürlich noch nicht ...

Das "net send" wird zu Testzwecken (durch das "echo" davor) nur dargestellt.

Eine Einschränkung gibt es hinsichtlich der verwendeten Texte: Ein "!" wird einfach "verschluckt", bei Verwendung zweier "!" verschwindet zusätzlich der Teil dazwischen. Grund dafür ist die "delayedexpansion", welche das "!" als Ersatz für das "%" bei Variablen benötigt.

Behübschen kann man/frau das Ganze ja im Fall des Falles später noch ...

Grüße
bastla

P.S.: Den Link zu Biber's Profil habe ich ua gesetzt, da Du dort die Links zu seinen äußerst empfehlenswerten Tutorials/Workshops findest ...
Member: Opachl
Opachl Oct 22, 2007 at 15:07:30 (UTC)
Goto Top
Danke für die schnelle Antwort habe noch eine weitere Idee:
Habe dabei allerdings ein Problem beim erstellen meiner Server.txt

Server.bat
@echo off
for /f "tokens=1-9 delims=:][ " %%a in (Server.txt) do call :processLine %%a %%b %%c %%d %%e %%f %%g %%h %%i
goto :listall

:processline
set "pcn1=%1"
set "pci1=%2"
set "pcn2=%3"
set "pci2=%4"
set "pcn3=%5"
set "pci3=%6"
set "pcn4=%7"
set "pci4=%8"
set "pcn5=%9"
goto :eof

:listall
echo.
echo Bitte Auswahl treffen
echo ##############################################################################
echo.
echo NR Name IP
echo 1 %pcn1% %pci1%
echo 2 %pcn2% %pci2%
echo 3 %pcn3% %pci3%
echo 4 %pcn4% %pci4%
echo 5 %pcn5%
echo.
echo 6 Zuruek
echo.
echo ##############################################################################
echo.

:menue
set /P auswahl=NR:

if /I "%auswahl%"=="1" (
echo 1
goto :PC1
)

if /I "%auswahl%"=="2" (
echo 2
goto :PC2
)

if /I "%auswahl%"=="3" (
echo 3
goto :PC3
)

if /I "%auswahl%"=="4" (
echo 4
goto :PC4
)

if /I "%auswahl%"=="5" (
echo 5
goto :PC5
)

if /I "%auswahl%"=="6" (
echo 6
call Batmenue.bat
)

:PC1
title *Nachricht an %pcn1%*
cls
echo Zielhost/IP: %pci1%
cls
echo Nachricht:
echo:
set /p b=
cls
echo Anzahl:
echo:
set /p c=
FOR /L %%h IN (0,1,%c%) DO net send %pci1% %b%
goto :listall

:PC2
title *Nachricht an %pcn2%*
cls
echo Zielhost/IP: %pci2%
cls
echo Nachricht:
echo:
set /p b=
cls
echo Anzahl:
echo:
set /p c=
FOR /L %%h IN (0,1,%c%) DO net send %pci2% %b%
goto :listall

:PC3
title *Nachricht an %pcn3%*
cls
echo Zielhost/IP: %pci3%
cls
echo Nachricht:
echo:
set /p b=
cls
echo Anzahl:
echo:
set /p c=
FOR /L %%h IN (0,1,%c%) DO net send %pci3% %b%
goto :listall

:PC4
title *Nachricht an %pcn4%*
cls
echo Zielhost/IP: %pci4%
cls
echo Nachricht:
echo:
set /p b=
cls
echo Anzahl:
echo:
set /p c=
FOR /L %%h IN (0,1,%c%) DO net send %pci4% %b%
goto :listall

:PC5
title *Nachricht an %pcn5%*
cls
echo Zielhost/IP: %pci5%
cls
echo Nachricht:
echo:
set /p b=
cls
echo Anzahl:
echo:
set /p c=
FOR /L %%h IN (0,1,%c%) DO net send %pci5% %b%
goto :listall

hiermit mache ich die server.txt
copy /b C:\ipsammlung\*.txt Server.txt

Das Ergebniss ist dann

PC1:xx.x.xxx.xxx: PC2:xx.x.xxx.xxx: PC3:xx.x.xxx.xxx: PC4:xx.x.xxx.xxx:

Mein Script oben kann das aber nur verarbeiten wenn die server.txt keine leerzeichen hat und immer das letzte doppelpunkt zeichen muss weg.
Gibt es da ne möglich keit die txt abzuändern oder vlt in der anderen txt datei?
Member: Opachl
Opachl Oct 22, 2007 at 15:23:08 (UTC)
Goto Top
Nun es sollten schon immer die neusten sein da es ja sonnst doppelte werte gibt zb:


Server1-11-10-06.txt
Name=Server1
Ip=xx.x.xxx.xxx


Server1.12.10.06.txt
Name=Server1
Ip=xx.x.xxx.xx2

Dann Würde es bei dir ja so ausehen
Nr Name IP
1 Server1 xx.x.xxx.xxx
2 Server1 xx.x.xxx.xx2

Deshalb benötige ich immer die neuste datei von jedem pc

Aber das Script ist echt super nochmals danke
Gruß Opachl
Member: bastla
bastla Oct 22, 2007 at 15:25:45 (UTC)
Goto Top
Hallo Opachl!

Ich sehe den Sinn des Ganzen nicht - eigentlich würde es genügen, wenn Du in meinem Batch oben
echo.
echo %Auswahl%
echo net send !IP%Auswahl%! Meine Meldung
echo Gesendet an !Name%Auswahl%!
ersetzt durch
title *Nachricht an !Name%Auswahl%!*
cls
echo Zielhost/IP: !IP%Auswahl%!
cls
echo Nachricht:
echo:
set /p b=
cls
echo Anzahl:
echo:
set /p c=
FOR /L %%h IN (0,1,%c%) DO net send !IP%Auswahl%! %b%

Was hast Du überhaupt mit dem Batch vor?

Grüße
bastla
Member: bastla
bastla Oct 22, 2007 at 15:30:46 (UTC)
Goto Top
Hallo Opachl!

Wie viele Dateien gibt es, wie sind sie (außer mit dem Datum) benannt - Server1 bis Server10?

Gibt es jeden Tag neue Dateien, so dass sie einfach anhand des Tagesdatums herausgefiltert werden können?

Werden immer alle Dateien erneuert, sodass, wie schon erwähnt, einfach das Dateidatum herangezogen werden kann?

Grüße
bastla
Member: Opachl
Opachl Oct 22, 2007 at 18:51:23 (UTC)
Goto Top
ich habe ca 10 pc´s die jeden Tag um ca 12 uhr mittags per Backup die txt datei anlegen als Report der Name beinhaltet immer

pcname-tag-monat-jahr.txt

dh nach 1 woche hätte ich ca
70 datein die alle mit dem jeweiligen pcnamen beginnen darauf folgt dann dass erstell datum.

das script müsste also den namen der txt datein lesen und für jeden gefunden namen nur jeweils das neuste dokument(datum) öffnen.

Wenn das geht wäre echt super ich habe echt keine idee wie ich das machen soll

mfg Opachl


Noch ne frage ich steh grade aufm Schlauch wie kann ich mehrere Festplatten durchsuchen nach einem bestimmten Ordnernamen zb "Bilder" und diesen möchte ich dann per xcopy auf ein anderes verszeichniss kopieren zb yxc:\test\bilder

danke wenn das noch sagen könntest
hast mir aber schon sehr geholfen
Member: bastla
bastla Oct 22, 2007 at 19:23:02 (UTC)
Goto Top
Hallo Opachl!

Ersetze den ersten Teil (bis vor ":Menue") durch
@echo off & setlocal enabledelayedexpansion
set "Quelle=C:\ipsammlung"  
set /a Anz=0
for %%p in (PC1 PC2 PC3 ... PC10) do (
	for /f %%d in ('dir "%Quelle%\%%p-*.txt" /b /od') do set "Datei=%Quelle%\%%d"  
	call :AddLine "!Datei!"  
)

Deine Zusatzfrage wäre einen neuen Thread wert ...

Grüße
bastla
Member: Opachl
Opachl Oct 22, 2007 at 20:40:53 (UTC)
Goto Top
danke nun geht alles

mfg Opachl