5

一種の多言語スクリプトを作成しようとしています。シェルまたはバッチのいずれかで「ブートストラップ」できますが、実際には複数の言語を実行する必要があるため、真のポリグロットではありません。私は問題なくこの部分を下に持っています。

私が問題を抱えている部分は、現在のファイルをメモリにロードし、さらに別の言語で書かれた特定のセクションを抽出し、それを変数に格納し、最終的に渡すことができる必要がある、少し埋め込まれた Powershell コードです。それを通訳に。XML に似たタグ付けシステムを使用して、他の言語と競合しないようにファイルのセクションをマークしています。マーカーは次のようになります。

lang_a_code
# <{LANGB}>
   ... code in language B ...
   ... code in language B ...
   ... code in language B ...
# <{/LANGB}>
lang_c_code

# はコメント マーカーですが、セクションの言語によってコメント マーカーが異なる場合があります。

私が抱えている問題は、ファイルのそのセクションだけを分離する方法が見つからないように見えることです。ファイル全体をメモリにロードできますが、タグ間のものを取り出すことができません。これが私の現在のコードです:

@ECHO OFF
SETLOCAL EnableDelayedExpansion

powershell -ExecutionPolicy unrestricted -Command ^

    $re = '(?m)^<{LANGB}^>(.*)^<{/LANGB}^>';^
    $lang_b_code = ([IO.File]::ReadAllText(^'%0^') -replace $re,'$1');^
    echo "${re}";^
    echo "Contents: ${lang_b_code}";

これまでに試したことはすべてContents、マーカー間のコードだけでなく、ファイル全体が出力されます。マーカーで使用されているシンボルをエスケープするさまざまな方法を試しましたが、結果は常に同じです。

:^トップレベルのインタープリターは Batch であり、山かっこやその他のランダムなものにハングアップするため、 の使用が必要です。

4

1 に答える 1

5

ブロックが1つしかないので、正規表現を使用できます

$re = '(?s)^<{LANGB}^>(.*)^^.*^<{/LANGB}^>';^

ただし、-match演​​算子を使用し$matches[1]て、の結果として設定された変数を使用してテキストにアクセスします-match

したがって、正規表現宣言の後に、次を使用します

[IO.File]::ReadAllText(^'%0^') -match $re;^
echo $matches[1];
于 2015-04-26T10:48:22.447 に答える