«ECHO включен» устанавливается в переменную - PullRequest
0 голосов
/ 26 января 2020

У меня есть командный файл, который принимает три параметра [log: путь], [logok: путь], [logerr: путь]. Значения соответствующего параметра: log:c:\logs\install.log, logok:c:\logs\installok.log, logerr:c:\logs\installerr.log.

Мне нужно обработать эти 3 параметра и установить их для соответствующей переменной log=c:\logs\install.log, logok=c:\logs\installok.log, logerr=c:\logs\installerr.log, поэтому что я могу использовать их на следующем шаге, чтобы создать файл с этими путями.

Я написал скрипт ниже, но почему-то каждая переменная печатает "ECHO on". Это должно фактически напечатать путь местоположения. Есть идеи, как этого добиться?

    REM PARAMS ARE [LOG:PATH] [LOGOK:PATH] [LOGERR:PATH]
    REM ACCESS WITH '%LOG%', '%LOGOK%' AND '%LOGERR%'

    REM SETUP LOCALIZED ENVIRONMENT VARIABLES FOR THE LOG, LOGOK AND LOGERR PARAMS

    SETLOCAL ENABLEDELAYEDEXPANSION
    FOR %%A IN (%*) DO (
    ECHO %%A >> C:\LOGS\TEST1.TXT
        FOR /F "TOKENS=1,2,3 DELIMS=:" %%G IN ("%%A") DO (
          SET %%G=%%H:%%I
        )
    )
    ENDLOCAL

    ECHO %LOG% >> C:\LOGS\TEST2.TXT
    ECHO %LOGOK% >> C:\LOGS\TEST3.TXT
    ECHO %LOGERR% >> C:\LOGS\TEST4.TXT

    START /WAIT MSIEXEC /I "%~DP0SETUP.MSI" /QN

    SET EXIT_CODE=%ERRORLEVEL%


    REM If the instalaltion is successful it should a create installok.log file in 'c:\logs'
       IF %EXIT_CODE% EQU 0 ECHO INSTALLED >> %LOGOK%  
    REM If it fails then it should a create installerr.log file 'c:\logs')
       IF NOT EXIST %LOGOK% ECHO FAILED >> %LOGERR%

Вывод TEST1.TXT:

log:c:\logs\install.log 
logok:c:\logs\installok.log
logerr:c:\logs\installerr.log 

Вывод TEST1.TXT, TEST2.TXT, TEST3.TXT:

 ECHO is on.

1 Ответ

1 голос
/ 26 января 2020

Попробуйте:

REM PARAMS ARE [LOG:PATH] [LOGOK:PATH] [LOGERR:PATH]
REM ACCESS WITH '%LOG%', '%LOGOK%' AND '%LOGERR%'

REM SETUP LOCALIZED ENVIRONMENT VARIABLES FOR THE LOG, LOGOK AND LOGERR PARAMS

SETLOCAL ENABLEDELAYEDEXPANSION
FOR %%A IN (%*) DO (
ECHO %%A >> c:\Logs\TEST1.TXT
    FOR /F "TOKENS=1,2,3 DELIMS=:" %%G IN ("%%A") DO (
      SET %%G=%%H:%%I
    )
)

ECHO !LOG! >> c:\LOGS\TEST2.TXT
ECHO !LOGOK! >> c:\LOGS\TEST3.TXT
ECHO !LOGERR! >> c:\LOGS\TEST4.TXT

START /WAIT MSIEXEC /I "%~DP0SETUP.MSI" /QN

SET EXIT_CODE=%ERRORLEVEL%


REM If the instalaltion is successful it should a create installok.log file in 'c:\logs'
   IF %EXIT_CODE% EQU 0 ECHO INSTALLED >> !LOGOK!
REM If it fails then it should a create installerr.log file 'c:\logs')
   IF NOT EXIST !LOGOK! ECHO FAILED >> !LOGERR!
ENDLOCAL

В основном это:

  • Расширяет локальную область видимости, так что переменные, которые были назначены внутри FOR l oop, будут доступны в остальной части скрипта
  • Перемещает переменные в синтаксис переменной !delayed!, чтобы их можно было оценить как можно позже. См. документацию для "EnableDelayedExpansion" для получения более подробной информации.

Обратите внимание, что "ECHO is on." - это вывод, который вы получаете при вызове echo без параметров:

C:\>type echo_test.bat
echo 
echo %no_such_variable%
C:\>echo_test.bat

C:\>echo
ECHO is on.

C:\>echo
ECHO is on.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...