5

我正在尝试创建一种多语言脚本。它不是真正的多语言,因为它实际上需要多种语言来执行,尽管它可以由 Shell 或 Batch “引导”。我把这部分下来没问题。

我遇到问题的部分是一些嵌入式 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

由于只有一个块,您可以使用正则表达式

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

但使用-match运算符,然后使用$matches[1]设置为结果的变量访问文本-match

所以,在正则表达式声明之后,使用

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