Пакетный скрипт: локальная переменная от function1 до function2 - PullRequest
1 голос
/ 22 января 2011

Хорошо, ребята, позвольте мне попытаться объяснить мою проблему:

Я начинаю со строки, откуда я запускаю 2 разные функции

setlocal EnableDelayedExpansion
for %%i in ("C:\*.*") do (
call :function1 "%%~i"
call :function2 "%%~i"
)
goto :eof

В функции 1 в определенный момент я делаю SET в локальной среде:

setlocal EnableDelayedExpansion
...
...
set name1=blabla
endlocal  & SET name=%name1%
echo %name%
goto :eof

Эхо возвращает мою переменную. Теперь о моей проблеме. Я выхожу из первой функции и перехожу к второй (см. Первый фрагмент кода) Я не могу вызвать переменную форму здесь. Я попытался в функции 2, я пытался до вызова функции 2, но оба не решили проблему.

Я предполагаю, что установил только локальную переменную для функции1. Я ищу сети, но читаю, что строка " endlocal & SET name =% name1% " должна была решить мою проблему.

Надеюсь, я все хорошо объяснил, вся помощь оценена!

Ответы [ 2 ]

2 голосов
/ 22 января 2011

Сначала маленький рабочий образец

@echo off
setlocal EnableDelayedExpansion

call :myAdd returnVar 1 2
echo 1. Percent %returnVar%
echo 1. Exlcam  !returnVar!

(
call :myAdd returnVar 4 5
echo 2. Percent %returnVar%
echo 2. Exlcam  !returnVar!
)
goto :eof

:myAdd
setlocal
set /a result=%2 + %3

(
  endlocal
  set %1=%result%
  goto :eof
)

---- Output ----
1. Percent 3
1. Exlcam  3
2. Percent 3
2. Exlcam  9

Причина неверного результата в "2. Проценты" - это результат расширения% var%.
Они расширяются во времяперед выполнением любой строки блока круглых скобок, поэтому в returnVar есть старое значение.

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

Хорошая идея - проверить эту проблему с помощью echo on.

2 голосов
/ 22 января 2011

Я не уверен, в чем ваша проблема, так как это прекрасно работает:

@setlocal enableextensions enabledelayedexpansion
@echo off
set name=ORIGNAME
for %%i in (1 2) do (
    call :function1 %%i
    echo in main %name% !name!
)
endlocal
goto :eof

:function1:
    setlocal enableextensions enabledelayedexpansion
    set name1=%1_blabla
    endlocal  & SET name=%name1%
    echo in function %name%
    goto :eof

Вывод:

in function 1_blabla
in main ORIGNAME 1_blabla
in function 2_blabla
in main ORIGNAME 2_blabla

Вы уверены , что, когда вы использовали name в основных областях, вы использовали !name! вместо %name%?

Если вы используете вариант %name%, он будет оцениваться при считывании всего цикла for, а не во время его использования (другими словами, он будет пустым). Вы можете видеть это в выводе ORIGNAME в строке main.

Я не уверен, что это так, поскольку вы используете отложенное расширение. Но, на всякий случай, я думал, что упомяну это. Я всегда использую отложенное расширение, а я всегда использовал ! варианты переменных среды, так как это более точно соответствует ожидаемой работе оболочки.

В любом случае, приведенный мною код работает нормально, так что вы можете поиграть с ним, чтобы посмотреть, сможете ли вы включить его в свой собственный.

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