3

2 種類のテンプレート変数を含むアプリ構成ファイルがあります。最初のセットは、ビルド時にいくつかの PowerShell スクリプトによって設定されます。2 番目は構成ファイル内に残りますが、実行時に使用されます。

したがって、ソース管理下では、ファイルは次のようになります。

<property name="$($settings.elementName)" value="${valueThatIsSubstitutedAtRuntime}" />

ビルド後、次のようになりたいです:

<property name="settingFromPosh" value="${valueThatIsSubstitutedAtRuntime}" />

しかし、残念ながらそれは次のように出てきます

<property name="settingFromPosh" value="" />

Powershell for Developers で説明されているテンプレート メソッドを少し変更したバージョンを使用しています。基本的に、代用する変数を ScriptBlock に入力し、テンプレートを読み取り、テンプレートの内容で Invoke-Expression を呼び出します。スクリプトは、検出できる値を正常に置換しますが、検出できない値は消去します。

テンプレート内で ps の全機能を使用したいので、正規表現トークンの置換を使用することに消極的です。また、ビルド中に入力したくない値に別の変数トークンを導入したくありません。

置換できない変数をそのままにしておくか、おそらくそれらをエスケープして無視する方法はありますか?

4

2 に答える 2

1

PowerShell がその中の変数を展開しようとしないように、文字列を一重引用符で囲みます。

<property name="$($settings.elementName)" value='${valueThatIsSubstitutedAtRuntime}' />

$ExecutionContext.InvokeCommand.ExpandString(...)次に、実行時に文字列を展開するために使用できます。

$foo = 'bar'
$str = '$foo'
$ExecutionContext.InvokeCommand.ExpandString($str)
于 2013-02-17T02:24:03.760 に答える
0

これでよろしいですか:

"${valueThatIsSubstitutedAtRuntime}" 

すべきではありません:

&{valueThatIsSubstitutedAtRuntime} 

その最初のものは、波括弧付き変数の構文です。「中括弧の間は何でも」という名前の変数を探していると思います(見つからないため、null文字列を返します)。それがスクリプトブロックなら、それを呼び出したいと思うでしょう。

于 2013-02-17T02:49:03.447 に答える