Почему моя переменная не вычитается в моем пакетном файле? - PullRequest
0 голосов
/ 04 апреля 2020

Я создаю командный файл, в основном простая игра.

Я написал две строки кода, одна из которых: set /a hp=%hp%-%edmg%

, а другая: set /a ehp=%ehp%-%dmg%

И почему-то работает первый, а второй доцент. Я попытался изменить имя переменной, удалив первую команду, поместив их под разными маркерами, но это не помогло. Есть ли какое-то решение для этого?

1 Ответ

0 голосов
/ 04 апреля 2020

Вы также можете использовать подпрограммы и / или макросы, если хотите немного повеселиться с кодированием

Подход, основанный на подпрограммах

Преимущество: легче выполнять дальнейшие изменения в блоках кода / для циклов

Недостаток: медленнее

@echo off & Goto :Main

:math
    Setlocal EnableDelayedExpansion
    Set "Var=!%~1!"
    Set /A "Var%2=%~3"
(
    Endlocal
    Set %1=%Var%
    Exit /B
)


:Main
    Set "@M=Call :math"
    Set Hp=40
    Set heal=30
    %@M% Hp - 20
    Echo(%Hp%
    %@M% Hp + heal
    Echo(%Hp%
    %@M% Hp / 3
    Echo(%Hp%
    %@M% Hp * 4
    Echo(%Hp%
    pause >nul

Макро-подход

Преимущество: более эффективно, чем вызовы подпрограмм.

Недостаток: менее интуитивно понятный, чтобы иметь возможность строить (хотя стоит освоить), процесс доступа и дальнейшей модификации переменной в кодовых блоках слишком сложен.

@Echo Off
    setlocal DisableDelayedExpansion
    (set LF=^


    %= Newline =%)
    Set ^"\n=^^^%LF%%LF%^%LF%%LF%^^"

    (Set "Operate=Endlocal ^& Set /A ""%%G%%H=%%I"""

    %= 'Tunnels' variable value, Allows Definition of Arithmetic within Macro =%)

    Set @M=for /L %%n in (1 1 2) do if %%n==2 (%\n%
    for /F "tokens=1,2,3 delims=, " %%G in ("!argv!") do (%\n%
    %Operate%%\n%
%=  Display value of variable. Not recommended, as Call reduces efficiency gain =%
    Call Echo(%%G: %%%%G%%%\n%
    ) %\n%
) ELSE setlocal enableDelayedExpansion ^& set argv=, 


%=  Facilitate modification of variables within codeblocks. =%
Setlocal EnableDelayedExpansion

REM macro can be used to define as well as modify variables
REM output of macro can be redirected to nul (hidden) like so:
REM (%@M% hp + 50)>nul

    %@M% hp + 50
    (%@M% heal + 30)>nul
    %@M% hp - 30
    %@M% hp + 25
    %@M% hp * 3
    %@M% hp / 2
    %@M% hp + heal
    %@M% heal - 10
    %@M% hp + heal
%=  Demomonstates use of equation beyond the initial Operator. Spaces cannot be used. =%
%=  Increments variable by a random amount in the range of 10 to 20 =%
    For /L %%A in (1,1,50) do (%@M% hp + !random!%%10+10)>nul
    Echo(hp: %hp%
    For /L %%A in (1,1,50) do (%@M% hp - !random!%%10+10)

pause
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...