1

複数のユーザー入力値に基づいてプロパティ ファイルを生成/書き込みするバッチ ファイルを作成しています。ただし、入力の値を記録していません。結果は次のようになります

prop1=
prop2=

これが機能するのを妨げている set について知っておく必要があることがあるのだろうか。

奇妙な点は、この特定のスクリプトを複数回実行すると、echo から出力される値が常に前回のユーザー入力のように見えることです。

コード:

@echo off

IF NOT EXIST data_file (
set /p prop1=Enter value: 
set /p prop2=Enter value: 
(echo prop1=%prop1%) > data_file 
(echo prop2=%prop2%) >> data_file 
) 
4

2 に答える 2

3

経験の浅いバッチャーの典型的な問題:)

%prop1%行が解析されると展開されます。あなたの問題は、括弧内のすべてが1回のパスで解析されることです。したがって、表示される値は、IF ステートメントを入力する前に存在していた値です。

2 つの簡単な解決策があります。

1) 論理を逆にして GOTO を使用して、囲んでいる括弧を削除します。

@echo off
IF EXIST file goto skip
set /p prop1=Enter value: 
set /p prop2=Enter value: 
(echo prop1=%prop1%) >file 
(echo prop2=%prop2%) >>file 
:skip

2) 遅延展開を使用する - 括弧内の各行が実行される直前に行われます

@echo off
setlocal enableDelayedExpansion
IF NOT EXIST file (
  set /p prop1=Enter value: 
  set /p prop2=Enter value: 
  (echo prop1=!prop1!)>file
  (echo prop2=!prop2!)>>file
)
于 2012-12-03T22:52:53.717 に答える
0

SETLOCAL ENABLEDELAYEDEXPANSION を使用して変数を展開するか、CALL を使用する必要があります。

@echo off

IF NOT EXIST data_file (
    set /p prop1=Enter value: 
    set /p prop2=Enter value:

    (
    Call echo prop1=%%prop1%%
    Call echo prop2=%%prop2%%
    ) > data_file 

)
于 2012-12-03T23:31:04.810 に答える