web-dev-qa-db-ja.com

ファイルからコマンドウィンドウに行を読み取り、変数を展開します

ファイルからコマンドウィンドウに行を読み込んでから、ファイルに書き戻すことができるかどうかを確認しようとしています。トリッキーな部分は、変数に似たテキストがあるファイルのどこかに、それを展開したいということです。

アイデアは、変数を設定してからデフォルトファイルを読み込み、変数をマスターからの値に置き換えるマスターバッチファイルを作成することです。

ファイルの内容

################################################################################
#
# 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
RMeyers

callは、一種のevalステートメントとして使用できます。

次のようなものを試してください

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

(未テスト)

1
ths

拡張の順序はおおまかに次のとおりです。

  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
dbenham