casper2k
Goto Top

2 Variablen in einem Batch Befehl

Hallo,

habe mal wieder ein Problem bei welchem ich eure Hilfe brauche.

Ich lese mit

FOR /F "delims=" %%i IN (d:\ordner\server.txt) DO call :test %%i
:test
echo %1

aus der server.txt die mehrere servernamen (untereinander) enthält,
die namen aus und verarbeite diese weiter (z.b. ein echo %1)

jetzt möchte ich aber die namen in einem befehl weiterverarbeiten bei
welchem ich 2 variablen nutzen muss, da ich über


FOR /F "delims=" %%i IN (\\%source-server%\e$\ordner\pruefen.txt) DO call :Produktiv %%i

aus einer weiteren datei wiederrum dateinamen einlese.


skizziert sieht dies dann so aus

copy Variable_Dateiname auf \\Variable_Server\c$\ordner\


ich möchte also mit der ersten variable die datei die die servernamen enthält auslesen und mit
der zweiten variable die dateinamen welche in der 2ten datei stehen einen copy job durchführen.

es befinden sich in beiden dateien mehrere angaben, also in der serverdatei mehrere servernamen
und in der datei-datei mehrere dateinamen

die frage ist nun, wie ich beide variablen in einem befehl gleichzeitig verwenden kann.

kann mir hierzu jemand helfen?

Content-Key: 93252

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

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

Member: bastla
bastla Jul 30, 2008 at 14:39:16 (UTC)
Goto Top
Hallo Casper2k!

Etwa so:
FOR /F "delims=" %%s IN (d:\inlog-update\server.txt) DO FOR /F "delims=" %%d IN (\\%source-server%\e$\ordner\pruefen.txt) DO copy "%%~d" "\\%%~s\c$\ordner\"  
oder, falls Du das Unterprogramm benötigst:
FOR /F "delims=" %%s IN (d:\inlog-update\server.txt) DO FOR /F "delims=" %%d IN (\\%source-server%\e$\ordner\pruefen.txt) DO call :Produktiv "%%~s" "%%~d"  
goto :eof

:Produktiv
echo '%~1' '%~2'  
goto :eof
Grüße
bastla
Member: Casper2k
Casper2k Jul 31, 2008 at 05:23:10 (UTC)
Goto Top
oh super!

mit dem 2ten kann ich mal weitermachen.
danke mal!
Member: Casper2k
Casper2k Jul 31, 2008 at 12:03:27 (UTC)
Goto Top
ah eins noch:

warum %%s und %%d ?
kann das nicht %%a und %%b heißen?
Member: bastla
bastla Jul 31, 2008 at 12:45:25 (UTC)
Goto Top
Hallo Casper2k!

warum %%s und %%d ?
Mnemotechnisch für Server und Datei ...

kann das nicht %%a und %%b heißen?
Wenn Du gesteigerten Wert darauf legst: natürlich - hättest Du aber auch ganz einfach ausprobieren können ...

Grüße
bastla
Member: Casper2k
Casper2k Jul 31, 2008 at 12:53:16 (UTC)
Goto Top
hmmm ja das habe ich auch.

kann es aber sein, das da nur maximal 1 mal die variable verarbeitet wird?

ich habe %1 dann später nochmal verwenden wollen, da hat es dann aber
mit der variable nicht mehr getan...
Member: bastla
bastla Jul 31, 2008 at 12:58:40 (UTC)
Goto Top
Hallo Casper2k!

%1 gilt im Unterprogramm ":Produktiv" - solange die gewünschte Verwendung innerhalb dieses Unterprogrammes (also vor "goto :eof") erfolgt, steht der Parameter auch zur Verfügung.

Grüße
bastla
Member: Casper2k
Casper2k Jul 31, 2008 at 13:31:15 (UTC)
Goto Top
hmm komisch.

dann müsste doch eigentlich

FOR /F "delims=" %%a IN (%logpath%\server_alle.txt) do echo Log-Verzeichnisse werden erstellt "%%~a"
md %logpath%\%date%
md %logpath%\%date%\'%~1'\%counter%\
md %logpath%\%date%\'%~1'\%counter%\ersetzt_durch\

funktionieren. %logpath% und %counter% habe ich natürlich schon als variable gesetzt.
Leider wird die Variable aber nicht gesetzt. Es erschein nur: ''
Member: bastla
bastla Jul 31, 2008 at 13:35:06 (UTC)
Goto Top
Hallo Casper2k!

Vorher war noch die Rede von %1 ...

%%a existiert nur innerhalb der "for"-Schleife, daher:
FOR /F "delims=" %%a IN (%logpath%\server_alle.txt) do (  
    echo Log-Verzeichnisse werden erstellt "%%~a"  
    md %logpath%\%date%
    md %logpath%\%date%\'%%~a'\%counter%\  
    md %logpath%\%date%\'%%~a'\%counter%\ersetzt_durch\  
)
[Edit] %~1 durch %%~a ersetzt. [/Edit]

Grüße
bastla

P.S.: Bitte beim Posten von Batches etc ""-Tags verwenden ...
Member: Casper2k
Casper2k Jul 31, 2008 at 13:43:36 (UTC)
Goto Top
ja mit %1 hab ichs auch versucht. aber rein damit ichs kapiere - wie müsste es denn aussehen wenn ich %1 nutzen möchte?
Member: bastla
bastla Jul 31, 2008 at 14:10:46 (UTC)
Goto Top
Hallo Casper2k!

Sorry - hatte übersehen, dass Du oben in den "md"-Zeilen noch %~1 hattest - siehe Edit ...

%1 kannst Du in einem Unterprogramm verwenden, und das sähe dann so aus:
FOR /F "delims=" %%a IN (%logpath%\server_alle.txt) do call :MakeDirs "%%a"  
goto :eof

:MakeDirs
echo Log-Verzeichnisse werden erstellt %1
md %logpath%\%date%
md %logpath%\%date%\'%~1'\%counter%\  
md %logpath%\%date%\'%~1'\%counter%\ersetzt_durch\  
goto :eof
BTW: Es genügt die letzte "md"-Zeile - die "dazwischen" liegenden Verzeichnisse werden automatisch erstellt ...

Noch eine Anmerkung: Die Apostrophe um %~1 sind nicht erforderlich, sondern waren in meinem ersten Beispiel oben nur zu Demozwecken enthalten.

Grüße
bastla
Member: Casper2k
Casper2k Aug 06, 2008 at 14:34:54 (UTC)
Goto Top
Nochmal ich face-smile


ich komm mit meinem Script einfach noch nicht weiter

habe hier mal einen teil des scriptes welcher mir noch probleme macht.

der teil "copy %logpath%\%~2 %logpath%\%date%\%~1\%counter%\ersetzt_durch"
scheint nichts zu kopieren, warum auch immer...

kann m ir da mal jemand auf die sprünge helfen?

thx
Casper
REM #######################################################################################################
:IRP_Produktiv

FOR /F "delims=" %%s IN (%logpath%\server_alle.txt) DO FOR /F "delims=" %%d IN (%logpath%\pruefen.txt) DO call :ProcessClient_IRP_Produktiv "%%~s" "%%~d"   
echo Es ist ein Fehler im Bereich :IRP_Produktiv aufgetreten >> %logpath%\log.txt

:ProcessClient_IRP_Produktiv

if exist \\%~1\d$\Programme\anwendung\Prod\name\ETATS\%~2 goto ProcessClient_IRP_Produktiv_Backup
if not exist \\%~1\d$\Programme\anwendung\Prod\name\ETATS\%~2 goto ProcessClient_IRP_Produktiv_Copy

:ProcessClient_IRP_Produktiv_Backup
echo ********************************************* >> %logpath%\log.txt
echo %~1 wird aus der Produktivumgebung gesichert. >> %logpath%\log.txt

echo Folgender Report wird aus der Produktivumgebung von %~1 gesichert: %~2 >> %logpath%\log.txt
copy \\%~1\d$\Programme\anwendung\Prod\name\ETATS\%~2 %logpath%\%date%\%~1\%counter%\ >> %logpath\log.txt

goto ProcessClient_IRP_Produktiv_Copy

:ProcessClient_IRP_Produktiv_Copy
echo ********************************************* >> %logpath%\log.txt
echo Folgender Report wird in die Produktivumgebung kopiert: >> %logpath%\log.txt
echo %~1 >> %logpath%\log.txt

echo %~2 wird auf %~1 kopiert >> %logpath%\log.txt
copy %logpath%\%~2 \\%~1\d$\Programme\anwendung\Prod\name\ETATS /Y >> %logpath%\log.txt
copy %logpath%\pruefen.txt %logpath%\%date%\%~1\%counter%\

copy %logpath%\*.qrp %logpath%\%date%\%~1\%counter%\ersetzt_durch

if errorlevel = 0 do call echo Kopiervorgang erfolgreich >> %logpath%\log.txt
if errorlevel = 1 do call :Fehler

REM Das Valid-Verzeichnis wird mit der neuen Datei upgedatet
ECHO Das Valid-Verzeichnis wird mit der neuen Datei upgedatet >> %logpath%\log.txt

copy %logpath\*.qrp \\server\software$\anwendung\name\Valid\name\ETATS /Y >> %logpath%\log.txt
goto :ende
REM #######################################################################################################
Member: bastla
bastla Aug 06, 2008 at 19:56:31 (UTC)
Goto Top
Hallo Casper2k!

Nach der Korrektur kleiner Ungenauigkeiten und dem Entfernen der wenig sinnvollen Zeilen 5 (diese Zeile wird bei korrektem Ablauf des Unterprogrammes ":ProcessClient_IRP_Produktiv" - wofür eine Beendigung dieses Unterprogrammes mit "goto :eof" oder durch das Erreichen des Batchendes Voraussetzung ist - immer erreicht), 9 und 19 sowie einiger nicht benötigter "/Y" ("copy" überschreibt bei Verwendung in einem Batch defaultmäßig bereits vorhandene Zieldateien) sowie dem Hinzufügen diverser Anführungszeichen (um auszuschließen, dass das Kopieren an Leerzeichen in einem Pfad scheitert) könnte der obige Batch-Teil etwa so aussehen (wobei allerdings zu berücksichtigen ist, dass ich den Rest des Batches nicht kenne):
REM #######################################################################################################
:IRP_Produktiv

FOR /F "delims=" %%s IN (%logpath%\server_alle.txt) DO FOR /F "delims=" %%d IN (%logpath%\pruefen.txt) DO call :ProcessClient_IRP_Produktiv "%%~s" "%%~d"   
goto :Weiter
REM ####### Ende dieses Teiles ########

:ProcessClient_IRP_Produktiv
if not exist "\\%~1\d$\Programme\anwendung\Prod\name\ETATS\%~2" goto ProcessClient_IRP_Produktiv_Copy  

:ProcessClient_IRP_Produktiv_Backup
echo ********************************************* >> %logpath%\log.txt
echo %~1 wird aus der Produktivumgebung gesichert. >> %logpath%\log.txt

echo Folgender Report wird aus der Produktivumgebung von %~1 gesichert: %~2 >> %logpath%\log.txt
copy "\\%~1\d$\Programme\anwendung\Prod\name\ETATS\%~2" "%logpath%\%date%\%~1\%counter%\" >> %logpath\log.txt  

:ProcessClient_IRP_Produktiv_Copy
echo ********************************************* >> %logpath%\log.txt
echo Folgender Report wird in die Produktivumgebung kopiert: >> %logpath%\log.txt
echo %~1 >> %logpath%\log.txt

echo %~2 wird auf %~1 kopiert >> %logpath%\log.txt
copy "%logpath%\%~2" "\\%~1\d$\Programme\anwendung\Prod\name\ETATS" >> %logpath%\log.txt  
copy "%logpath%\pruefen.txt" "%logpath%\%date%\%~1\%counter%\" >nul  

copy "%logpath%\*.qrp" "%logpath%\%date%\%~1\%counter%\ersetzt_durch" >nul  
if errorlevel 1 goto :Fehler

echo Kopiervorgang erfolgreich >> %logpath%\log.txt

REM Das Valid-Verzeichnis wird mit der neuen Datei upgedatet
ECHO Das Valid-Verzeichnis wird mit der neuen Datei upgedatet >> %logpath%\log.txt

copy "%logpath\*.qrp" "\\server\software$\anwendung\name\Valid\name\ETATS" >> %logpath%\log.txt  
goto :eof
REM ######## Ende Unterprogramm #########

:Weiter
REM ######## Hier geht es nach den Schleifen oben weiter ... #########
Wenn Deiner "log.txt" nicht zu entnehmen ist, woran das Kopieren scheitert (immerhin protokollierst Du ja %~1 und %~2 an mehreren Stellen), bleibt Dir eigentlich nur, vor dem fehlerhaften Teil mittels "echo on" das "Anzeigen der Befehle vor der Ausführung" einzuschalten und den Batch von der Kommandozeile mit Umleitung der Ausgaben und Fehlermeldungen in eine weitere Protokolldatei zu starten, etwa
D:\DeinBatch.cmd > D:\DeinBatchLog.txt 2>&1
In der so entstehenden "D:\DeinBatchLog.txt" sind dann alle einzelnen Befehlszeilen und Fehlermeldungen enthalten, was Dir eigentlich das Auffinden des Fehlers ermöglichen sollte.

Grüße
bastla
Member: Casper2k
Casper2k Aug 07, 2008 at 11:28:46 (UTC)
Goto Top
klasse, jetzt tuts! danke dir!!