Powershell:将文件的一部分读入变量

Powershell: Read a section of a file into a variable

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

我遇到问题的部分是一些嵌入式 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,'');^
    echo "${re}";^
    echo "Contents: ${lang_b_code}";

到目前为止,我尝试的所有操作都会导致整个文件在 Contents 中输出,而不仅仅是标记之间的代码。我尝试了不同的方法来转义标记中使用的符号,但结果总是一样。

注意:需要使用^,因为顶级解释器是Batch,它挂在尖括号和其他随机的东西上。

因为只有一个块,你可以使用正则表达式

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

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

因此,在正则表达式声明之后,使用

[IO.File]::ReadAllText(^'%0^') -match $re;^
echo $matches[1];