Batch: Variable verzögert

Von: , Frage gestellt am Mi, 6. Sep 2006

Hallo,
Ich bins nochmal :-)
Ich habe ein eigenartiges Problem. Wenn ich mit SET einer Variablen in einer Schleife einen Wert zuweise, dann erhält sie magischerweise erst im nächsten Durchlauf diesen Wert. Hier ist das Phänomen beschrieben

http://www.robvanderwoude.com/index.html

Mein Batch programm soll eine Zahl modulo 25 ausrechnen. Also 24 wird 0, 26 wird 25 und 51 wird 50. Mein Code bisher:


set FOLDERFILTER=2006
set FILEFILTER=Z_????*.*
set FOLDER_DEST=dest
...
set COUNT=0
for /R %%i in (%FOLDERFILTER%) do (
rem echo 1=%%i
if exist %%i (
rem echo 2=%%i
for /F "delims==" %%j in ('dir "%%i\%FILEFILTER%" /b /s /a-d') do (
rem echo 3=%%j
set FILE_PATH=%%j
set FILE_NAME=%%~nj
set FILE_TIME=%%~tj
call :subroutine_copy_file %%j
)
)
)
goto end subroutine_copy_file
echo 4=%*
set NUMBER=%FILE_NAME:~2,4%
set POSTFIX=%FILE_NAME:~6,1%
echo number1=%NUMBER%
echo rest=%POSTFIX%
if %NUMBER% GEQ 0000 (
if %NUMBER% LEQ 9999 (
rem echo number ok
if %POSTFIX% NEQ "geändert" (
set /a TARGET = %NUMBER% %% 25
echo target1=%TARGET%
set /a TARGET=NUMBER-TARGET
set /a COUNT=COUNT+1
)
)
)
goto:EOF


Und hier die Ausgabe:

C:\Chris\_private\b>a.bat

4=C:\Chris\_private\b\source\kundeA\2006\Z_0099Ä.xls
number1=0099
rest=Ä
Ungültige Zahl. Nummerische Konstanten sind entweder dezimale (17),
hexadezimale (0x11) oder oktale (021) Zahlen.
Ungültige Zahl. Nummerische Konstanten sind entweder dezimale (17),
hexadezimale (0x11) oder oktale (021) Zahlen.
target1=1225
4=C:\Chris\_private\b\source\kundeA\2006\Z_1234N.xls
number1=1234
rest=N
target1=-1225
4=C:\Chris\_private\b\source\kundeA\2006\Z_3971A.xls
number1=3971
rest=A
target1=1225
4=C:\Chris\_private\b\source\kundeA\2006\Z_4321N2.xls
number1=4321
rest=N
target1=3950
4=C:\Chris\_private\b\source\kundeA\2006\projekt1\Z_1234Z.xls
number1=1234
rest=Z
target1=4300
number of files copied: 5

Kann mir jeman helfen? Das Programm ist ja fast fertig. Es fehlt nur noch dieses Problem :-(

Gruß
Chris

3 Antworten zu dieser Frage

  1. Antwort von nach 5 Stunden 0 hilfreich
    Re: Batch: Variable verzögert

    Hi,

    also irgendwie bin ich über die Sache mit dem Modulo gestolpert, eigentlich ist das doch allgemein 25*(Zahl DIV 25) set /a TARGET = %NUMBER% %% 25
    Hier soll das dann auch passieren, oder? Müsste es nicht set /a TARGET = %NUMBER% / 25
    set /a TARGET = %TARGET% * 25
    sein?

    mfg
    Matze

    • Antwort von nach einem Tag 0 hilfreich
      Re^2: Batch: Variable verzögert

      Ja, da gebe ich Dir Recht. Aber in der Ausgabe stimmt es komischerweise. Ich habe mein Problem gelöst, indem ich den SET Befehl vor die IF Anweisung geschoben habe!
      Grüße
      Chris [Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

  2. Antwort von nach 22 Stunden 0 hilfreich
    Re: Batch: Variable verzögert

    Hallo. Ich bins nochmal :-)
    Ich auch. ;) subroutine_copy_file
    echo 4=%*
    set NUMBER=%FILE_NAME:~2,4%
    set POSTFIX=%FILE_NAME:~6,1%
    echo number1=%NUMBER%
    echo rest=%POSTFIX%
    if %NUMBER% GEQ 0000 (
    if %NUMBER% LEQ 9999 (
    rem echo number ok
    if %POSTFIX% NEQ "geändert" (
    set /a TARGET = %NUMBER% %% 25
    echo target1=%TARGET%
    set /a TARGET=NUMBER-TARGET
    set /a COUNT=COUNT+1
    )
    )
    )
    goto:EOF

    Und hier die Ausgabe:

    C:\Chris\_private\b>a.bat

    4=C:\Chris\_private\b\source\kundeA\2006\Z_0099Ä.xls
    number1=0099
    rest=Ä
    Ungültige Zahl. Nummerische Konstanten sind entweder dezimale
    (17),
    hexadezimale (0x11) oder oktale (021) Zahlen.
    Ungültige Zahl. Nummerische Konstanten sind entweder dezimale
    (17),
    hexadezimale (0x11) oder oktale (021) Zahlen.
    target1=1225
    Das Problem ist, dass Zahlen mit führenden 0en als Zahlen im 8er-System behandelt werden, also nur die Ziffern 0 bis einschließlich 7 enthälten dürfen. Da die Zahlen bei dir aber Dezimalzahlen sind, geht das schief. Du musst aus den Variablen führende 0en ausfiltern, bevor du sie innerhalb von "set /a" - wo sie als Zahlen interpretiert werden sollen - nutzen kannst.

    Gruß,
    Sebastian.

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!