1

PowerShell 3 では、文字列に対して正規表現置換を実行しています。'$1' 位置パラメータを変数として関数に渡したいと考えています (script.ps1 の最後の行を参照)。

私のコード

testFile.html

<%%head.html%%>
<body></body></html>

head.html

<!DOCTYPE html>
<html><head><title></title></head>

スクリプト.ps1

$r = [regex]"<\%\%([\w.-_]+)\%\%>" # matches my markup e.g. <%%head.html%%>
$fileContent = Get-Content "testFile.html" | Out-String # test file in which the markup should be replaced
function incl ($fileName) {        
    Get-Content $fileName | Out-String
}
$r.Replace($fileContent, (incl '$1'));

問題は script.ps1 の最後の行にあります。これは、Get-Content が $fileName から正しい値を取得できるように関数呼び出しを解決する方法が見つからなかったことです。エラーメッセージから「$1」の読み取りと見なされます。

Get-Content : Cannot find path 'C:\path\to\my\dir\$1' because it does not exist.

「C:\path\to\my\dir\head.html」が欲しい

基本的に、このスクリプトで達成したいことは、<%% %%> マークで指定した場所にある他の静的 HTML ページを自分のページにマージすることです。

何か案は?ありがとうございました。

4

1 に答える 1

3

これを試して:

@'
<%%head.html%%>
<body></body></html>
'@ > testFile.html

@'
<!DOCTYPE html>
<html><head><title></title></head>
'@ > head.html

$r = [regex]"<\%\%([\w.-_]+)\%\%>"
$fileContent = Get-Content testFile.html -Raw
$matchEval = {param($matchInfo)         
    $fileName = $matchInfo.Groups[1].Value
    Get-Content $fileName -Raw
}
$r.Replace($fileContent, $matchEval)

2 番目のパラメーターは、MatchInfo 型のパラメーターを 1 つ想定する MatchEvaluator コールバックです。また、v3 を使用している場合は、 を介してパイプする必要はありません。パラメーター on をOut-String使用するだけです。-RawGet-Content

ところで、matchEvalという関数(スクリプトブロックではない)がある場合、これを行う方法があります。

$r.Replace($fileContent, $function:matchEval)
于 2013-07-20T19:09:38.937 に答える