2017-03-08 4 views
2

Windowsバッチプログラミングで部分文字列を実行しようとしていますが、Linuxスクリプトと同じくらい簡単ではないようです。Windowsバッチプログラミングで変数を使用する

ここに私のコードスニペットがあります。

set ENV_STRING=-Dhello.env=hello -Dhello.alt.dir=C:\Works\download -Dhello.type=DDDDD 
set START_INDEX=34 
set END_INDEX=51 
SET newStr=%ENV_STRING:~%START_INDEX%,%END_INDEX%% 

START_INDEXとEND_INDEXは、ユーザーが提供するENV_STRINGに応じて変更されます。これらの変数が使用されていることを示すために、私はSTART_INDEXとEND_INDEXに静的整数を使用しています。 ENV_STRINGからhello.alt.dirの値を抽出したいだけです。

newStrを出力すると、文字列の部分文字列は出力されません。

誰かが間違っている部分を指摘してもらえますか?

ありがとうございました。

+0

質問は不明です、希望する結果を示してください。 – jfatal

+0

ENV_STRINGから '-Dhello.alt.dir'の値である 'C:\ Works \ download'のみを抽出したいと思います。 – user826323

+1

'SET newStr =!ENV_STRING:〜%START_INDEX%!%END_INDEX%!'を遅延拡張で使用するか、 'CALL SET newStr = %% ENV_STRING:〜%START_INDEX%、%END_INDEX %%%'を使用してください。私はあなたに[この回答](http://stackoverflow.com/questions/10166386/arrays-linked-lists-and-other-data-structures-in-cmd-exe-batch-script/10167990#10167990)を読むことをお勧めします。この管理については説明していますが、トピックは異なります。 – Aacini

答えて

2

次のコードを使用することができます:変数の参照内START_INDEXまたはEND_INDEXなどの環境変数の値を参照することはできません

@echo off 
set "ENV_STRING=-Dhello.env=hello -Dhello.alt.dir=C:\Works\download - Dhello.type=DDDDD" 
set "START_INDEX=34" 
set "END_INDEX=51" 
setlocal EnableDelayedExpansion 
set "newStr=!ENV_STRING:~%START_INDEX%,%END_INDEX%!" 
endlocal & set "newStr=%newStr%" 

を。 Windowsコマンドインタープリタは、変数参照の解釈に失敗します。

解決策は、置換が適用される変数の遅延拡張と、上記のコードに示すように、開始および終了インデックス参照のための即時拡張を使用しています。

しかしSETLOCALコマンドは、現在の環境変数のコピーを作成し、そのための環境変数newStrは、コマンドの後にもうENDLOCALは、現在の環境変数のリストを破棄し、前の変数のリストを復元存在しないでしょう。この解決策は、即時可変展開を1行で行うENDLOCALおよびSETを使用しています。

BTW:文字列の分割は、通常、Windowsのバッチスクリプトでfor /Fを使用して行われます。

2

このようにしてみてください:それが実行されたとき!式で囲まれた遅延膨張および変数で

setlocal enableDelayedExpansion 
set ENV_STRING=-Dhello.env=hello -Dhello.alt.dir=C:\Works\download -Dhello.type=DDDDD 
set START_INDEX=34 
set END_INDEX=51 
SET newStr=!ENV_STRING:~%START_INDEX%,%END_INDEX%! 
echo -%newStr%- 

(すなわち遅延)を評価します。 %で囲まれた変数はすぐに置き換えられますが、%の衝突を避けることができます。

関連する問題