svatvn
Goto Top

Batch Quellcode aus TXT lesen

Hallo Leute,
meine Batchdatei soll eine Text-Datei (code.txt) auslesen und dessen Inhalt "übernehmen"
und als normalen Batch-Code ausführen.
Der Inhalt der ganzen Batchdatei soll also auf eine zentrale TXT-Datei zugreifen.


Hintergrund ist, dass ich eine bestimmte Batchdatei an mehreren Orten ausführen muss.
Momentan muss ich jedes mal, sobald sich der Code dieser Batch ändert, an allen anderen Orten kopieren, also "verteilen"

Nun sollen alle Batch-Dateien auf diese selbe TXT-Datei zurückgreifen und so immer den gleichen Code haben.

Hoffe es ist verständlich was gemeint ist.

Danke

Content-Key: 190184

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

Printed on: April 24, 2024 at 01:04 o'clock

Member: bastla
bastla Aug 24, 2012 at 19:55:39 (UTC)
Goto Top
Hallo svatvn!
Hoffe es ist verständlich was gemeint ist.
Nicht ganz - und ich vermute mal, dass es eine Lösung über Parameter, auch aus einer TXT-Datei geben sollte; kannst Du das mal etwas konkreter darstellen?

Grüße
bastla
Member: rubberman
rubberman Aug 24, 2012 at 20:09:39 (UTC)
Goto Top
Hallo svatvn und bastla!

Warum muss die Batchdatei eigentlich lokal liegen? Es können durchaus mehrere User gleichzeitig auf eine remote platzierte Batchdatei zugreifen.
Wie auch immer - teste mal folgendes:

test.bat
@type "test.txt">>"%~f0"  

test.txt
@echo off
echo Hello World!
pause

>"%~f0" echo @type "test.txt"^>^>"%%~f0"  
Die letzte Zeile der Textdatei verstzt den Batch in seinen ursprünglichen Zustand zurück.

Grüße
rubberman
Member: svatvn
svatvn Aug 24, 2012 updated at 22:05:00 (UTC)
Goto Top
Zitat von @rubberman:
Warum muss die Batchdatei eigentlich lokal liegen?
Hallo rubberman,
die Batch muss jeweils den Ordnernamen herausfinden, in dem sie sich gerade befindet. Daher muss sie zwangsweise lokal dort liegen...
Ich werd aber deinen Code ausprobieren. Danke face-smile

@bastla
ich will, dass der QuellCode nicht in der Batchdatei selbst steht.
In der Batchdatei soll nur ein Verweis auf eine Text-Datei (z.B. C:\batchcode.txt) stehen, aus welcher er sich den Code holen soll.

Stell dir vor, du hast 1000 Batch-Dateien mit dem selben QuellCode. Wenn sich der QuellCode ändert, müsstest du den Inhalt von 1000 Batchdateien ändern.
Wenn jedoch alle Batch-Dateien auf die selbe Text-Datei zugreifen, musst du nur 1 mal den Inhalt einer einzigen TXT-Datei ändern und alle Batchdateien sind sofort auf dem selben Stand...
Member: bastla
bastla Aug 24, 2012 updated at 22:10:53 (UTC)
Goto Top
Hallo svatvn!

Was macht denn der Batch so Geheimnisvolles, dass Du das nicht darstellen kannst/willst? face-wink

Anyhow: Wenn Du wirklich in jedem Ordner einen Batch platzierst, um den Ordnernamen herauszufinden, kann dieser immer noch einfach aus der Zeile
\\Server\Freigabe\EigentlicherBatch.cmd "%~dp0"
oder lokal eben
C:\EigentlicherBatch.cmd "%~dp0"
bestehen und so dem "eigentlichen" Batch den Ordner als Parameter mitteilen ...

Grüße
bastla
Member: svatvn
svatvn Aug 24, 2012 updated at 22:49:24 (UTC)
Goto Top
Zitat von @bastla:
Was macht denn der Batch so Geheimnisvolles, dass Du das nicht darstellen kannst/willst? face-wink
ich kann keine Batch posten, weil ich noch gar keine spezielle Batch habe.
Ich habe viele Batch-Code-Schnipsel, die ich immer wieder exakt in der selben Form brauche.

Jetzt kam mir die Idee, die Code-Schnipsel zentral in einem Ordner, einer Art "Datenbank" in Form von TXT-Dateien zu speichern. Dadurch können alle meine Batch-Dateien un Zukunft auf diese Datenbank zugreifen und hätten immer den aktuellsten Code.

Verstehst du jetzt was ich meine? ^^

Oder gut, meinetwegen kann es auch irgendein Code wie dieser sein:

Die Datei C:\BatchDatenbank\Ort-Anzeiger.txt hat folgenden Inhalt
@echo off

::Dieser Code zeigt den aktuellen Ort und den Ordnernamen an:
echo mein jetziger Pfad lautet %CD%
for /f "delims=\" %%a in ("%cd%") do (echo Ich befinde mich im Ordner %%~nxa)  

Wie kann jetzt eine Batch-Datei (die überall irgendwo liegen kann) jetzt den Inhalt dieser Ort-Anzeiger.txt als Code übernehmen und ausführen?
Member: bastla
bastla Aug 24, 2012 at 22:58:29 (UTC)
Goto Top
Hallo svatvn!

Wie soll denn die aufrufende Batch-Datei gestartet werden?

Das gepostete Beispiel würde zB 1:1 als Batch in C:\BatchDatenbank abgelegt funktionieren - Demo von der Kommandozeile (aus dem Ordner "D:\Testordner"):
D:\Testordner>C:\BatchDatenbank\Ort-Anzeiger.cmd
mein jetziger Pfad lautet D:\Testordner
Ich befinde mich im Ordner Testordner

D:\Testordner>
Wenn Du gesteigerten Wert darauf legst, kannst Du die eine Zeile
@C:\BatchDatenbank\Ort-Anzeiger.cmd
natürlich auch in einen eigenen Batch schreiben ... face-wink

Noch einfacher wird's, wenn Du "C:\BatchDatenbank" der Variablen "%Path%" hinzufügst - dann musst Du noch nicht mal den Pfad angeben, sondern kannst den Batch einfach mit
Ort-Anzeiger
aufrufen.

Grüße
bastla
Mitglied: 60730
60730 Aug 24, 2012 at 23:01:10 (UTC)
Goto Top
moin,

Ich habe viele Batch-Code-Schnipsel, die ich immer wieder exakt in der selben Form brauche.

  • also ich mach das ganz einfach....

zuerst vergleicht sich die batch selber mit einer, die auf einer freigabe liegt und genauso heisst - kommt ein ok gehts banal weiter, kommt kein ok - gehts in ne unterfunktion, die die Datei vom Server lokal kopiert und die dann startet und ab ins ende der Batch, damit beendet die sich automatisch.

Aber das macht natürlich nur Sinn bei vollständigen Tieren, nicht bei schnippseln...

N8
Mitglied: 60730
60730 Aug 25, 2012 updated at 10:38:13 (UTC)
Goto Top
ich hab das Ding mal rausgesucht.....


:para
set "source=server\freigabe"  
fc \\%source%\%~nx0 c:\script\%~nx0 >nul && goto samescript
if not exist c:\script\ md c:\script\ && copy \\%source%\%~nx0 c:\script\%~nx0

start "machwas" /wait c:\script\%~nx0  
exit
goto end

:samescript
echo machwas
pause

:end
@bastla:
Manchmal macht es doch Sinn, das Script lokal zu haben und dort auszuführen, das obere antonymisierte und stark gekürzte Teil ist u.a für das Snapshotten im Einsatz, das Tool (vom Tom Ehlert) mags nicht, wenn schon ein handle auf die Fraigabe besteht und offen ist, auf den gesichert wird und ich mag das trennen zwischen - auf dem Server ist das Script und auf nem anderen liegt das "Backup" drauf nicht so gerne, denn im Zweifel brauch ich so nur eine quelle.

@ot
Ich hab das Ding da oben sehr stark verkürzt und gebe keine Garantie, dass ich nicht was wichtiges wegrationalisiert hab.
Es ist Samstag über 25° und gefühlte 80% Luftfeuchte die Frisur sitzt, aber die Server müssen grade alle umziehen.
Member: bastla
bastla Aug 25, 2012 updated at 11:21:22 (UTC)
Goto Top
@t-mo
Manchmal macht es doch Sinn, das Script lokal zu haben und dort auszuführen
Kein Einwand (gegen "Manchmal" face-wink), aber bis ich dafür einen vernünftigen Grund von svatvn gelesen habe, halte ich mich an "allermeistens" ...

Grüße
bastla

P.S.: Deiner Zeile 8 fehlt etwas der Witz ... face-wink
Mitglied: 107961
107961 Aug 25, 2012 at 12:55:26 (UTC)
Goto Top
Moin erstmal

kann man die nicht per call aufrufen und den aktuellen Pfad übergeben ?

ungefähr so:
call "c:\datenbank\deinebatch.bat" "%cd%"

Gruß Bobo
Member: bastla
bastla Aug 25, 2012 updated at 13:10:15 (UTC)
Goto Top
Hallo BOBO927!

Natürlich kann man (darum geht es ja eigentlich die ganze Zeit schon face-wink) - und wenn der aktuelle Ordner als Parameter übergeben werden soll, genügt auch
call "c:\datenbank\deinebatch.bat" .
oder einfach, wie oben schon gezeigt
call "c:\datenbank\deinebatch.bat"
da sich ja der aktuelle Ordner durch den Batchaufruf nicht ändert und daher im aufgerufenen Batch weiterhin als "%cd%" zur Verfügung steht; ob übrigens "call" erforderlich ist, ergibt sich natürlich aus dem Rest (so es einen solchen gibt) des aufrufenden Batches ...

Grüße
bastla
Member: Leopold.Bloom
Leopold.Bloom Aug 29, 2012 at 04:28:09 (UTC)
Goto Top
Hallo svatvn

Müssen es unbedingt Text Files sein? Ich habe mir für solche Zwecke eine lib.cmd geschrieben.

@echo off

set TARGET=%1
set PARAMS=

Rem Für den Fall, dass man ein paar Parameter mehr hat
Rem ansonsten ist bei %9 Schluss
Rem In der Theorie eine beliebig lange Parameterliste
Rem könnte sein, dass es ab 256 Zeichen Probleme gibt.
Ram Habe ich noch nicht ausprobiert

:get_param
	shift
	set PARAMS=%PARAMS% %1
if not "%1"=="" goto get_param  
call :%TARGET% %PARAMS%

goto :eof

:pfad
echo mein jetziger Pfad lautet %CD% 
for /f "delims=\" %%a in ("%cd%") do (echo Ich befinde mich im Ordner %%~nxa)  
goto :eof

:beispiel

set V1=%1
set V2=%2
set V3=%3
set V4=%4
set V5=%5
set V6=%6
set V7=%7
set V8=%8
set V9=%9
shift
set V10=%9
shift
set V11=%9

ECHO V1=%V1% V2=%V2% V3=%V3% V4=%V4% V5=%V5% V6=%V6% V7=%V7% V8=%V8% V9=%V9% V10=%V10% V11=%V11% 
ECHO Es wurden 11 Parameter übergeben
goto :eof

Damit kann ich einzelne Funktionen aufrufen. Somit brauche ich nicht für jeden Schnipsel eine eigene bat oder cmd Im Aufrufbatch heißt es dann.

call lib beispiel 1 2 3 4 5 6 7 8 9 10 11
call lib pfad

Wenn lib.cmd nicht im lokalen Directory liegt sondern zentral z.B.auf
e:\mylibs

call e:\mylibs\lib beispiel 1 2 3 4 5 6 7 8 9 10 11
call e:\mylibs\lib pfad

Der aufgerufene Code läuft immer lokal. Es ist egal wo die lib liegt. Es funktioniert mit gemappten Netzlaufwerken und auch mit gemappten Webdav LW. Die lib kann in einer Cloud liegen, wenn diese gemappt ist. Allerdings geht dann die Performance vielleicht in die Knie.

Damit habe ich eine Art Library für Funktionen. Ich brauche das dafür, dass ich nicht jede Funktion in jedem Batch haben muss. Die oft genutzten Funktionen werden ausgelagert. Ich will Übersicht in meinen Batches und nicht soviel suchen. Wenn ich irgendwas irgendo schon mal verwendet habe, finde ich es nicht. Nützliche Funktionen kommen in die lib.cmd dann brauche ich sie nicht neu zu schreiben. Und falls mal eine Funktion geändert werden muss, brauche ich es auch nur an einer Stelle zu tun.

So ein Aufruf geht natürlich auch mit einer ganzen Batch. Das einzige Problem ist - was machst Du, wenn Du den Aufbewahrort für Deine libs änderst? Das Problem hättest Du bei Deinem Konzept aber auch.

LG aus HH

Leo
Member: Leopold.Bloom
Leopold.Bloom Aug 29, 2012 at 05:49:04 (UTC)
Goto Top
Es geht auch sowas

set "$=call y:\TOSHIBA-USB3-5--HDD-01\LIB\lib23"  
set "$$=call lib"  

%$%  gettime
%$$% pfad 
%$$% beispiel 1 2 3 4 5 6 7 8 9 10 11

Ich finde, das räumt den Code auf. Auch hier der Vorteil - wenn sich der Pfad für eine lib ändert habe ich nur eine Stelle zu ändern für alle Aufrufe.

LG

Leo
Member: Biber
Biber Sep 03, 2012 updated at 14:38:29 (UTC)
Goto Top
Moin svatvn,

öhhmmm.... wassn hier jezz' Status der Frage?

Seid ihr noch bei der Frageklärung, der Theorem-Formulierung für das Wintersemester 2012/2013 oder ist die Frage schon beantwortet, was ja durchaus an mir vorbeigerauscht sein könnte?

Gib doch mal bitte Zeichen, ob "Erledigt" oder "Um interessante Folgeprobleme bereichert" oder "Das nächste Mal frag' ich lieber meinen Friseur" oder was ist der Stand?

Grüße
Biber