2

この議論に基づいてマクロ置換を実装しようとしています。基本的には機能しますが、ExpandString にはいくつかの制限があるようです。

main.ps1:

$foo = 'foo'
$text = [IO.File]::ReadAllText('in.config')
$ExecutionContext.InvokeCommand.ExpandString($text) | out-file 'out.config'

in.config (OK):

$foo

in.config (エラー: 「文字列トークンの処理中に行末が見つかりました。」):

"

in.config (エラー: 「文字列の末尾に ' がありません。」):

'

ドキュメントには次のように記載されています。

戻り値: すべての変数と式の置換が行われた展開された文字列。

「式置換」とは何ですか (これは私の場合かもしれません)?

回避策はありますか?

4

1 に答える 1

3

引用符 (一重および二重) は PowerShell ランタイムの特殊文字であるため、エラーが発生しています。これらは文字列を示し、その文字として使用する場合はエスケープする必要があります。

考えられる回避策は、希望する結果に応じて、引用符をバックティックでエスケープすることです。

たとえば、私のテキストファイルが

'$foo' 

その文字列の結果の展開は次のようになります

PS>$text = [io.file]::ReadAllText('test.config')
PS>$ExecutionContext.InvokeCommand.ExpandString($text)
$foo

その変数を展開したい場合は、それらの引用符をエスケープする必要があります。

`'$foo`'
PS>$text = [io.file]::ReadAllText('test.config')
PS>$ExecutionContext.InvokeCommand.ExpandString($text)
'foo'

または、対になっていない一重引用符または二重引用符を使用する場合は、エスケープする必要があります。

これらの文字をエスケープするために文字列で -replace を実行できますが、それが全体的に望ましい効果であることを確認する必要があります。

PS>$single, $double = "'", '"'    
PS>$text = [io.file]::ReadAllText('test.config') -replace "($single|$double)", '`$1'
PS>$ExecutionContext.InvokeCommand.ExpandString($text)

注: ExpandString 呼び出しを実行すると、バッククォートがぶらぶらしなくなります。

于 2009-03-26T17:42:21.700 に答える