schilling
Goto Top

Problem Batch Ausgabe in File

Guten Tag,

ich versuche mich gerade an Batch Skripting und habe schon viele hilfreiche Tips von hier, ohne die ich nie so weit gekommen wäre. Nun fehlt mir noch ein Baustein zum Ziel und ich hoffe ihr könnt mir dabei helfen. Worum gehts?

Ich hole hier ein bisschen weiter aus, damit ihr auch nachvollziehen könnt, was ich mache: Es gibt ein Netzlaufwerk. Darauf soll mittels Robocopy im Mirror Mode ein Abbild eines lokalen Ordners erstellt werden. Die Namen der Ordner, welche Lokal und auf dem Netzlaufwerk existieren, werden vom Admin vorgegeben. Um nun einen neuen Ordner inkl. dazugehörigem Batch Script zum automatischen Kopieren mittels Robocopy zu erstellen, gibt es folgendes Script. Dieses liest den Firmennamen ein und erstellt einen Ordner inkl. Script:

Das Script lautet:

@set /p namevar=Bitte Firmennamen eingeben:
@echo Firmenordner und Upload Skript werden erstellt. Einen Moment bitte...
@mkdir "%namevar%"  
@echo @echo off>"%namevar%\rc_upload_%namevar%.bat"  
@echo REM === ATTENTION === ATTENTION ===>>"%namevar%\rc_upload_%namevar%.bat"  
@echo REM ===============================>>"%namevar%\rc_upload_%namevar%.bat"  
@echo REM === DO NOT MODIFY THIS FILE ===>>"%namevar%\rc_upload_%namevar%.bat"  
@echo REM ==== DATEI NICHT VERÄNDERN ====>>"%namevar%\rc_upload_%namevar%.bat"  
@echo REM ===============================>>"%namevar%\rc_upload_%namevar%.bat"  
@echo REM ==== ACHTUNG ==== ACHTUNG =====>>"%namevar%\rc_upload_%namevar%.bat"  
@echo REM ===============================>>"%namevar%\rc_upload_%namevar%.bat"  
@echo for /f "delims=" %%%i in ('echo %%cd%%') do set "Verzeichnispfad=%%%~ni">>"%namevar%\rc_upload_%namevar%.bat"  
@echo if "%%Verzeichnispfad%%"=="%namevar%" goto Verzeichnisstimmt>>"%namevar%\rc_upload_%namevar%.bat"  
@echo :Verzeichnisstimmtnicht>>"%namevar%\rc_upload_%namevar%.bat"  
@echo robocopy.exe %namevar% "\\<pfad.zu.netzlaufwerk>\%namevar%\%%lun%%" /TEE /LOG:log_%namevar%.txt /MIR /Z /XD *privat* /XF rc_upload_%namevar%.bat>>"%namevar%\rc_upload_%namevar%.bat"  
@echo goto :eof>>"%namevar%\rc_upload_%namevar%.bat"  
@echo :Verzeichnisstimmt>>"%namevar%\rc_upload_%namevar%.bat"  
@echo robocopy.exe ../%namevar% "\\<pfad.zu.netzlaufwerk>\%namevar%\%%lun%%" /TEE /LOG:../log_%namevar%.txt /MIR /Z /XD *privat* /XF rc_upload_%namevar%.bat>>"%namevar%\rc_upload_%namevar%.bat"  
@echo REM === ATTENTION === ATTENTION ===>>"%namevar%\rc_upload_%namevar%.bat"   
@echo REM ===============================>>"%namevar%\rc_upload_%namevar%.bat"  
@echo REM === DO NOT MODIFY THIS FILE ===>>"%namevar%\rc_upload_%namevar%.bat"   
@echo REM ==== DATEI NICHT VERÄNDERN ====>>"%namevar%\rc_upload_%namevar%.bat"   
@echo REM ===============================>>"%namevar%\rc_upload_%namevar%.bat"   
@echo REM ==== ACHTUNG ==== ACHTUNG =====>>"%namevar%\rc_upload_%namevar%.bat"  
@echo REM ===============================>>"%namevar%\rc_upload_%namevar%.bat"  

Wenn ich das Script ausführe und als Kundennamen "Testkunde3" eingebe, lautet die Ausgabe:

@echo off
REM === ATTENTION === ATTENTION ===
REM ===============================
REM === DO NOT MODIFY THIS FILE ===
REM ==== DATEI NICHT VERÄNDERN ====
REM ===============================
REM ==== ACHTUNG ==== ACHTUNG =====
REM ===============================
if "%Verzeichnispfad%"=="Testkunde3" goto Verzeichnisstimmt  
:Verzeichnisstimmtnicht
robocopy.exe Testkunde3 "\\<pfad.zu.netzlaufwerk>\Testkunde3\%lun%" /TEE /LOG:log_Testkunde3.txt /MIR /Z /XD *privat* /XF rc_upload_Testkunde3.bat  
goto :eof
:Verzeichnisstimmt
robocopy.exe ../Testkunde3 "\\<pfad.zu.netzlaufwerk>\Testkunde3\%lun%" /TEE /LOG:../log_Testkunde3.txt /MIR /Z /XD *privat* /XF rc_upload_Testkunde3.bat  
REM === ATTENTION === ATTENTION === 
REM ===============================
REM === DO NOT MODIFY THIS FILE === 
REM ==== DATEI NICHT VERÄNDERN ==== 
REM =============================== 
REM ==== ACHTUNG ==== ACHTUNG =====
REM ===============================

Leider entspricht die Ausgabe nicht dem gewünschten Ergebnis, denn folgende Zeile fehlt in der Ausgabe zw. Zeile 8 und 9 vollständig:
for /f "delims=" %%i in ('echo %cd%') do set "Verzeichnispfad=%%~ni"  

Die Ausgabe auf der Kommandozeile sieht so aus:

T:\>make_kunde_v3.bat
Bitte Firmennamen eingeben:Testkunde3
Firmenordner und Upload Skript werden erstellt. Einen Moment bitte...
for /f "delims=" %T:\%~ni">>"Testkunde3\rc_upload_Testkunde3.bat"  
T:\>

So weit ich es sehe, werden gewisse Variablen in dieser Zeile ersetzt, obwohl ich sie mittels zusätzlichem "%" eingetragen habe. Ist das überhaupt die korrekte Vorgehensweise, wenn ein Batch Script bestimmte Variablen nicht ersetzen soll, sie mit jeweils doppeltem "%" davor und danach zu kennzeichnen? Bei den restlichen Zeilen funktioniert es wunderbar.

Für Hilfe wäre ich sehr dankbar.

Mit freundlichen Grüßen,
Daniel

Content-Key: 101303

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

Printed on: April 25, 2024 at 17:04 o'clock

Member: bastla
bastla Nov 07, 2008 at 12:40:51 (UTC)
Goto Top
Hallo schilling und willkommen als schreibendes Mitglied face-wink!

Ist das überhaupt die korrekte Vorgehensweise, wenn ein Batch Script bestimmte Variablen nicht ersetzen soll, sie mit jeweils doppeltem "%" davor und danach zu kennzeichnen?
Grundsätzlich ja, nur musst Du das auch konsequent umsetzen und jedes "%"-Zeichen verdoppeln:
@echo for /f "delims=" %%%%i in ('echo %%cd%%') do set "Verzeichnispfad=%%%%~ni">>"%namevar%\rc_upload_%namevar%.bat"
Noch eine Anmerkung: Für Dein obiges Vorhaben würde ich eher zu folgender Schreibweise greifen:
@echo off & setlocal
set /p namevar=Bitte Firmennamen eingeben:
echo Firmenordner und Upload Skript werden erstellt. Einen Moment bitte...
mkdir "%namevar%"  

 >"%namevar%\rc_upload_%namevar%.bat" echo @echo off  
>>"%namevar%\rc_upload_%namevar%.bat" echo REM === ATTENTION === ATTENTION ===  
>>"%namevar%\rc_upload_%namevar%.bat" echo REM ===============================  
...
Vorteil: Die unterschiedliche Länge der zu schreibenden Batchbefehle stört (mich) viel weniger, wenn sie am Ende der Zeile auftritt - so wird der zu erstellende Batch leichter lesbar (zumindest im Editor face-wink).

Wenn Du dann noch den Pfad der Batchdatei in eine Variable packst, könnte das so aussehen:
@echo off & setlocal
set /p namevar=Bitte Firmennamen eingeben:
echo Firmenordner und Upload Skript werden erstellt. Einen Moment bitte...
mkdir "%namevar%"  
set B="%namevar%\rc_upload_%namevar%.bat"  

 >%B% echo @echo off
>>%B% echo REM === ATTENTION === ATTENTION ===
>>%B% echo REM ===============================
...

Grüße
bastla
Member: schilling
schilling Nov 07, 2008 at 18:11:46 (UTC)
Goto Top
Vielen Dank, bastla. face-smile

Ich werde deinen Tip gleich berücksichtigen. Klingt sehr plausibel, sämtliche % mit einem zweiten % zu versehen. Wenn man halt so viel Zeit vor dem eigenen Skript verbringt, sieht man oft den Wald vor lauter Bäumen nicht mehr. face-smile Danke auch für die zusätzlichen Tips.

Sollte es klappen, werde ich den Thread als gelöst markieren, ansonsten melde ich mich nochmal.

Liebe Grüße und ein schönes Wochenende,
Daniel