2009-03-26 6 views
2

this discussionに基づいてマクロ置換を実装しようとしています。基本的には動作しますが、ExpandStringは、いくつかのlimitatoinsを持っているようだ:

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(エラー: "文字列の末尾に「行方不明")。:

' 

ドキュメントの状態:

Return Value: The expanded string with all the variable and expression substitutions done.

'式の置換は'(これは私の場合である可能性がある)とは何ですか?

回避策はありますか?

答えて

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呼び出しを実行した後は、バックティックがもうぶら下がることはありません。

+0

これは実際にPS2のバグで、修正されました: - / – Jaykul