Возвращает значение функции функции в пакетном скрипте - PullRequest
0 голосов
/ 20 декабря 2018

Это может быть дубликатом нескольких вопросов в SO, Dostips и SS64.Проведенное мною исследование показало, что я должен обратить внимание на _scope_ в функциях.но мои решения просты и понятны, но проблема все еще существует

  1. , что на самом деле стоит за SETLOCAL и ENDLOCAL
  2. Как context работал в пакетных сценариях, например (goto) 2>nul
  3. Почему (goto) заключен в фигурные скобки (объяснено в dostips )

Вот код, который я уже написал для копирования файла из одного местадругому.Мои цели были:

  • Исследование scope и context пакетного сценария
  • повторное использование кода
    @echo off
    setlocal EnableDelayedExpansion
    goto :main

:main
    setlocal
    set _app=test
    set _base=C:/wamp64/www
    set _destination=!_base!/test
    set _source=%~dp0%/build
    set /A _flag=0

    echo *********************************************
    echo    Deploying in %~1 mode: %TIME%
    echo        Deploy path: !^_destination!
    echo *********************************************

    call :check !_base!, !_app!, _flag
    if !_flag!==0 (
        call :create !_base!, !_app!
    )
    xcopy "!_source!" "!_destination!" /D /C
    exit /b 0
    endlocal

:setbase 
    echo ::::: setting up base :::::
    chdir /D C:

    rem the base dir for app to exists=> %1
    chdir %~1 
    exit /b 0

:check 
    echo ::::: checking for local web server destination :::::
    call :setbase %~1

    set %~3= dir /p|find /C "%~2"
    exit /b 0

:create 
    echo ::::: creating the app folders :::::

    rem setting the base to create app folder %1
    call :setbase %~1
    mkdir %~2
    exit /b 0

endlocal

Это вывод, который яполучить, когда я инициирую deploy.bat

*********************************************
   Deploying in production mode: 19:28:53.13
       Deploy path: C:/wamp64/www/test
*********************************************
::::: checking for local web server destination :::::
::::: setting up base :::::
0
::::: creating the app folders :::::
::::: setting up base :::::
A subdirectory or file test already exists.

похоже на If !_flag! == 0, который проверяет, существует ли папка приложения в корневом каталоге сервера и не работает вообще.Когда я узнал способ передачи параметров другим функциям;я подумал, что он передает pointer ссылку, но похоже, что она тесно связана с scope.Итак, что здесь происходит в коде.

1 Ответ

0 голосов
/ 20 декабря 2018

Проверка наличия файла / каталога

Код, который вы используете для проверки существования каталога (?):

set %~3= dir /p|find /C "%~2"

Я не думаю, что это делает то, что вынамерены.SET /P часто используется таким образом, чтобы передать вывод команды в переменную окружения.(Хотя вы даете от /P до dir, что разбивает на страницы вывод - возможно, не то, что вы хотели.) Однако команда, которая у вас есть, этого не сделает.Я предполагаю, что для этого нужно установить переменную (буквально) "dir / p", а затем передать это через find-count.Эти результаты find.exe /C никогда не возвращаются в envvar.Выходная строка "0" является результатом передачи (ничего) через find.exe /C.

Я предлагаю более простой тест на существование:

IF EXIST "%~2" (SET /A %~3=1) ELSE (SET /A %~3=0)

Этот тест работал на моей машине Win10.

Я видел некоторые различия в том, как работает IF EXIST.Если вы не хотите использовать это, вы можете сделать это с помощью цикла FOR.

FOR /F "tokens=*" %%e IN ('DIR /B') DO IF "%%~e"=="%~2" SET /A %~3=1

Если вы хотите использовать канал в команде FOR, вам придется его избежать.

FOR /F "tokens=*" %%e IN ('DIR /B ^| find /C "%~2"') DO SET /A %~3=%%~e

Все три из этих методов работали для меня.

SETLOCAL

Я не думаю, что существует официальное справочное руководство по синтаксису cmd, кроме встроенногоhelp (SETLOCAL /?)

Мой опыт показывает, что он помещает все envvars и рабочие каталоги в «стек» и соответствующие ENDLOCAL или EXIT (хотя в сценариях вы почти * 1035)* всегда хочу использовать EXIT /B) вытолкнет окружение из этого "стека".По сути, это означает, что изменения envvar / CWD, сделанные вами в SETLOCAL, будут только временными.

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