2

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

Идея состоит в том, чтобы иметь файл мастер-пакета, в котором я устанавливаю переменные, затем считываю файл по умолчанию и заменяю переменные значениями из мастера.

Содержание файла

################################################################################
#
# Response file
#
################################################################################

################################################################################
#
# License Acceptance
#
# If you accept the license, <value> should be "true".
#
LICENSE_ACCEPTED=true

################################################################################
#
# Server host name
#
# The server host name. Server name should be FQDN
#
SERVER_HOSTNAME=%SERVER_HOSTNAME%

################################################################################
#
# Install user name
#
INSTALL_USER_NAME=%INSTALL_USER_NAME%

################################################################################
#
# Create user or not
#
# true:  create new user
# false: do not create new user. use existing user
#
CREATE_USER=false

Мой вывод для строки INSTALL_USER_NAME будет INSTALL_USER_NAME = USER

Проблема в том, что переменные, кажется, не раскрываются, когда они считываются и выводятся в файл.

ОБНОВЛЕНИЕ: решение, указанное ниже

SETLOCAL ENABLEDELAYEDEXPANSION
for /F "delims=" %%a in (E:\TEMP\WindowsAdditionalServer.properties) do (
call echo %%a>>"E:\TEMP\BASE.properties"
)

2 ответа2

1

Порядок расширения примерно таков:

  1. Параметры, например %1 или %*
  2. Нормальное расширение переменной, например %var%
  3. Переменные FOR, например %%V
  4. Задержка расширения, например !var!
  5. ЗВОНИТЕ с другим раундом нормального расширения

Вы можете использовать трюк CALL для расширения переменных после раскрытия переменных FOR, но это относительно медленно. Лучше использовать отложенное расширение.

Вы были на правильном пути, когда вы включили отложенное расширение, но вам также нужно заменить ! для % в вашем файле шаблона. Поэтому INSTALL_USER_NAME=%INSTALL_USER_NAME% следует изменить на INSTALL_USER_NAME=!INSTALL_USER_NAME! , Тогда все будет работать, и это будет быстрее.

1

call может быть использован как своего рода оператор eval.

Попробуйте что-то вроде

SET INSTALL_USER_NAME=USER    
for /F "delims=" %%a in (E:\TEMP\WindowsAdditionalServer.properties) do (call echo %%a>>"E:\TEMP\BASE.properties")

(Непроверенные)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .