1 (изменено: novashdima, 2013-03-11 17:16:00)

Тема: CMD/BAT: Работа с переменными

Добрый день.
Заранее извиняюсь, если такое было, в чем я уверен. Есть определенная задача, простая до ужаса, но!
1: я консоль виндовую юзаю для запуска пары утилит для восстановления, как и в линуксе в общем-то
2: делать все это я должен по методичке, но никто нифига не объясняет,до этого лабораторные были совсем простые с тривиальными задачами, а вот с переменными не работал, а в методичке ничего не написано, а код неправильный,  препод поставил задачу - заставить скрипт работать
Скрипт начальный весь в ошибках, пара строк всего правильная. Вот сама задача:
Вводят две переменные, если любая из них пустая вывести "absent", если все норм - "happy end", вывод результата в файл. Вот до чего я дошел:

echo off
setlocal
set /p %1="Enter value of variable 1: "
set /p %2="Enter value of variable 2: "
if ("!1!" == nul) or ("!2!" == nul) goto label_1
set p1=%1%
set p2=%2%
set /A p3=p1+p2
echo %p3% > 0_Log1.txt
endlocal
goto label_2
: label_1
echo %absent
pause
exit
: label_2
echo %happy end
pause
exit

Вопрос первый - в ифе видел использовали и "!var!" и %var%, и все равно не так.
Вопрос второй - юзать nul или null?
Вопрос третий - echo %p3% > 0_Log1.txt выводит в файл 0 постоянно.

2

Re: CMD/BAT: Работа с переменными

Я на "пустоту", например, на наличие переданного параметра (который %1) проверяю так:


IF %1.==. GOTO NO_PARAM
WBR. Roman

3 (изменено: novashdima, 2013-03-11 14:11:43)

Re: CMD/BAT: Работа с переменными

Rom5 пишет:

IF %1.==. GOTO NO_PARAM

А зачем точки ставить? Что-то мне ошибку на .==. выдает.

4

Re: CMD/BAT: Работа с переменными

Я так понимаю, что "текст_в_переменной" + "." сравнивается с "."
Если текст в переменной отсутствует, то получается, что сравнивается точка с точкой, т.е. результатом будет Истина.

Можно по идее попробовать сравнивать и так:


IF "%1"=="" Goto :empty_param
IF "%%myvar"=="" Goto :empty_myvar
WBR. Roman

5

Re: CMD/BAT: Работа с переменными

Rom5 пишет:

Я так понимаю, что "текст_в_переменной" + "." сравнивается с "."
Если текст в переменной отсутствует, то получается, что сравнивается точка с точкой, т.е. результатом будет Истина.

Можно по идее попробовать сравнивать и так:


IF "%1"=="" Goto :empty_param
IF "%%myvar"=="" Goto :empty_myvar

Пробовал первым способом - неожиданный операнд goto, как-то так
вторым тоже пробовал, не получается, пробовал еще с nul сравнивать
и пробовал не только "%%myvar", но и %%myvar %myvar "!myvar!"

6

Re: CMD/BAT: Работа с переменными

Я делаю так:

@echo off
setlocal enableextensions enabledelayedexpansion

set sParam1=%~1

if defined sParam1 (
    echo [%sParam1%]
) else (
    echo Usage: %~nx0 ^<Parameter^>
)

endlocal
exit /b 0

7

Re: CMD/BAT: Работа с переменными

А что делает
set sParam1=%~1
И у меня ругается:
Непредвиденное появление: defined

8

Re: CMD/BAT: Работа с переменными

novashdima, приведите Ваш код.

9

Re: CMD/BAT: Работа с переменными

@echo off
setlocal enableextensions enabledelayedexpansion
set /p %1="Enter value of variable 1: "
set /p %2="Enter value of variable 2: "
if (not defined %1) or (not defined %2) goto label_1
set p1=%1%
set p2=%2%
set /A p3=p1+p2
echo %p3% > 0_Log1.txt
endlocal
goto label_2
: label_1
echo %absent
pause
exit
: label_2
echo %happy end
pause
exit

10

Re: CMD/BAT: Работа с переменными

@echo off
setlocal enableextensions enabledelayedexpansion

set /p sValue1=Enter value of variable 1: 
set /p sValue2=Enter value of variable 2: 

if defined sValue1 (
    if defined sValue2 (
        set /a iValue3 = sValue1 + sValue2
        >0_Log1.txt echo !iValue3!
        echo happy end
    )
)

endlocal
exit /b 0

11

Re: CMD/BAT: Работа с переменными

Спасибо, работает, но есть вопросы:
Зачем ivalue3 заключать в !!
Что делает включение опций: enableextensions enabledelayedexpansion?

12

Re: CMD/BAT: Работа с переменными

Зачем ivalue3 заключать в !!
Что делает включение опций: enableextensions enabledelayedexpansion?

Поскольку значение переменной окружения задаётся внутри операторных скобок и раскрывается эта же переменная окружения также внутри тех же операторных скобок — нужно использовать не символы процента — %Var% (в этом случае раскрытие переменной окружения и вычисление её значения произойдёт на момент входа в скобки), а символы отложенного раскрытия — !Var! (в этом случае раскрытие переменной окружения и вычисление её значения произойдёт в момент её использования). А для разрешения самой возможности использования отложенного раскрытия как раз и используется команда «setlocal enabledelayedexpansion».

13

Re: CMD/BAT: Работа с переменными

Ага, понятно, как по мне немного бредово, почему не как в обычном языке программирования, построчное выполнение, тогда не будет вопросов, что делать с переменной, сейчас юзать или потом?
А enableextensions?
И раз уж так, где можно почитать ман по основам? Читать маны к каждой конкретной функции можно, но не отражает, как же их всех вместе юзать.

14

Re: CMD/BAT: Работа с переменными

«setlocal enableextensions» — разрешить расширенную обработку команд. Что конкретно сие даёт для каждой команды — смотреть в описании каждой команды. Включено по умолчанию.

И раз уж так, где можно почитать ман по основам? Читать маны к каждой конкретной функции можно, но не отражает, как же их всех вместе юзать.

CMD/BAT: Коллекция ссылок

15

Re: CMD/BAT: Работа с переменными

Еще один способ. Может неуклюжий - но у меня работает!

@ECHO OFF
::Присваиваем пустое значение
SET/p MyVar=""<nul

CALL :CheckValue %MyVar% IsEmpty Value 

ECHO MyVar %Value% & pause
EXIT

:CheckValue
Setlocal
SET MyVarValue=%~1
EndLocal & SET %2=%MyVarValue%
EXIT/b

16

Re: CMD/BAT: Работа с переменными

Если какая-то из переменных не введена, то я должен вывести absent, можно ли сделать покрасивше такое?

@echo off
setlocal enableextensions enabledelayedexpansion

set /p sValue1=Enter value of variable 1: 
set /p sValue2=Enter value of variable 2: 

if defined sValue1 (
    if defined sValue2 (
        set /a iValue3 = sValue1 + sValue2
        >0_Log1.txt echo !iValue3!
        echo happy end
    ) else ( echo %absent )
) else ( echo %absent )

endlocal
exit /b 0

17

Re: CMD/BAT: Работа с переменными

@echo off
setlocal enableextensions enabledelayedexpansion

set /p sValue1=Enter value of variable 1: 
set /p sValue2=Enter value of variable 2:
set sMessage=absent

if defined sValue1 (
    if defined sValue2 (
        set /a iValue3 = sValue1 + sValue2
        >0_Log1.txt echo !iValue3!
        set sMessage=happy end
    )
)

echo %sMessage%

endlocal
exit /b 0

Как то так. Ничего лучшего в голову уже не приходит.
Но в данном конкретном случае придется еще громоздить блок проверки и преобразования введенных значений из string в integer.
Попробуйте ввести 12 и 03.

18

Re: CMD/BAT: Работа с переменными

Эм... если я правильно понимаю код, то выполнятся действия, выведется хеппи енд, а потом еще выведется абсент, а задача другая

Попробуйте ввести 12 и 03.

Попробовал, все отлично считается

19

Re: CMD/BAT: Работа с переменными

Сообщение выводится командой ECHO в конце. А вот его значение будет зависить от успешности исполнения условия.
По поводу 12 и 03, тут я ошибся. Хотел написать 12 и 08. Попробуйте, получите сообщение о неверном числе, а iValue3 останется пустой.
А можно ввести 13 и DК или ёпрст, кто знает, что придет в голову бестолковому пользователю.