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

时间:2015-04-26 08:52:27

标签: regex powershell batch-file embedded-resource polyglot

我试图创建一种多语言脚本。它不是一个真正的多语言,因为它实际上需要多种语言才能执行,尽管它可以被#st;引导"通过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,它挂在尖括号和其他随机内容上。

1 个答案:

答案 0 :(得分:5)

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

-match

但使用$matches[1]运算符,然后使用-match生成的[IO.File]::ReadAllText(^'%0^') -match $re;^ echo $matches[1]; 变量访问该文本。

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

setcookie($cookie_id,$token,$nextWeek);