为什么在此PowerShell脚本中有这么多StringConstantExpressionAst?

桑贾斯

我正在对某些PowerShell数据集进行规范化,一个处理步骤是将所有变量替换为X,并将所有字符串文字替换为Y,以便我可以检测和删除几乎重复的重复项。

但是,我注意到对于规范化后的许多脚本,整个脚本可以归结为很多Y和一些X,几乎没有其他任何代码。这不是我所期望的,因为脚本中只有少数变量和字符串文字。

要查找所有字符串文字,我使用了以下命令:

$Strings = $AST.FindAll({$args[0] -is System.Management.Automation.Language.StringConstantExpressionAst]}, $true)

为了解决此问题,我使用了ShowPSAst(PowerShell AST可视化工具)来可视化一个示例脚本,其中上述问题很明显。

原始脚本如下所示:

 Describe "Files" -Tag OSX,Linux {
    It "is utf-8 encoded" {
        $true | Should Be $false
    }
    It "uses Unix-style line endings" {
        $true | Should Be $false
    }
    It "has a shebang" {
        $true | Should Be $false
    }
}
Describe "Placeholder for Nano tests" -Tag Nano {
}

规范化后,我得到以下内容:

Y Y -Tag Y,Y {
    Y Y {
        X | Y Y X
    }
    Y Y {
        X | Y Y X
    }
    Y Y {
        X | Y Y X
    }
}
Y Y -Tag Y {
}

上面脚本的AST可视化摘录:

以上脚本的AST可视化的一部分

请注意,图像右面板中突出显示的部分与左面板中的AST节点相对应,然后AST节点CommandAST具有许多子StringConstantExpressionAst节点。查看这些AST节点,就可以理解为什么我的规范版本中有那么多Y。但是,令我感到困惑的是,为什么突出显示的代码中几乎所有的单独标记都被视为StringContantExpressionAst我希望只"Placeholder for Nano tests"将其视为String Literal。

确切地说,我希望

Describe "Placeholder for Nano tests" -Tag Nano

转化为

 Describe Y -Tag Nano

而不是

Y Y -Tag Y

I don't really use PowerShell on my own and don't know its intricacies, so I apologize if I'm missing something basic and I am thankful in advance for any help in understanding this PowerShell behavior.

mclayton

PowerShell is an interpreted language, which means it doesn't attach a meaning to some parts of your code until you run it. In your case, it doesn't know that the word "Describe" is referring to the Describe function in the Pester module (which might not even be imported into your session yet), and it could equally mean an external program called "Describe.exe" for example.

All the parser does is make a note of the name of the command as a StringConstantExpressionAst, and it's up to the runtime logic to look for something to run that has that name.

如果仔细查看AST,您会发现“ Describe”令牌的StringConstantType属性为,BareWord"my tests"字符串的值为DoubleQuoted如果只想对“文字字符串”进行处理,则可以将该StringConstantType属性用作过滤器。

$Strings = $AST.FindAll(
    {
        ( $args[0] -is [System.Management.Automation.Language.StringConstantExpressionAst] ) -and
        ( $args[0].StringConstantType -ne "BareWord" )
    },
    $true
)

除了那么你可能会等东西错过未加引号的字符串:

Describe Files -Tag OSX,Linux {

因此,另一个(更好的?)选项可能是忽略任何CommandAst节点中的第一个子元素。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么/ dev中有这么多设备?

来自分类Dev

为什么/ dev中有这么多设备?

来自分类Dev

为什么在ASP.NET Identity的“ UserStore”中有这么多存储库?

来自分类Dev

为什么在“钥匙串”的“私钥”部分中有这么多的iMessage签名密钥?

来自分类Dev

为什么罗斯林中有这么多的对象池实现?

来自分类Dev

为什么Linux中有这么多/ dev / tty?

来自分类Dev

为什么 kern.log 中有这么多的霹雳消息?

来自分类Dev

为什么我的主目录中有这么多 cron.#### 文件?

来自分类Dev

为什么 Python 中有这么多的格式化风格?

来自分类Dev

为什么在java中有这么多获取日期时间的方法?

来自分类Dev

为什么会有这么多的符号链接?

来自分类Dev

为什么会有这么多sidekiq进程?

来自分类Dev

ActionCable:为什么有这么多连接?

来自分类Dev

为什么有这么多python版本在使用?

来自分类Dev

当您具有“字符串”类型时,为什么ABAP中有这么多“字符”类型?

来自分类Dev

为什么OPENCV中有这么多函数使用InputArray和OutputArray作为函数参数?

来自分类Dev

为什么OPENCV中有这么多函数使用InputArray和OutputArray作为函数参数?

来自分类Dev

当我有这么多RAM时,为什么我的系统这么慢?

来自分类Dev

为什么在modules.dep中有这么多条目?

来自分类Dev

HTTP / 2的协议ID是什么,为什么有这么多?

来自分类Dev

为什么在基础图像上有这么多图层?码头工人

来自分类Dev

为什么<h3>和<p>之间有这么多空间

来自分类Dev

基本的npm + Webpack:为什么会有这么多模块?

来自分类Dev

为什么我会有这么多滞后?

来自分类Dev

为什么我有这么多REPOSITORY name = <none>的Docker映像?

来自分类Dev

SATA电源连接器上为什么有这么多的针脚?

来自分类Dev

为什么会有这么多虚拟终端设备?

来自分类Dev

为什么我有这么多ngen.exe进程?

来自分类Dev

在UITableView中使用“自动布局”,为什么周围有这么多额外的空间?

Related 相关文章

  1. 1

    为什么/ dev中有这么多设备?

  2. 2

    为什么/ dev中有这么多设备?

  3. 3

    为什么在ASP.NET Identity的“ UserStore”中有这么多存储库?

  4. 4

    为什么在“钥匙串”的“私钥”部分中有这么多的iMessage签名密钥?

  5. 5

    为什么罗斯林中有这么多的对象池实现?

  6. 6

    为什么Linux中有这么多/ dev / tty?

  7. 7

    为什么 kern.log 中有这么多的霹雳消息?

  8. 8

    为什么我的主目录中有这么多 cron.#### 文件?

  9. 9

    为什么 Python 中有这么多的格式化风格?

  10. 10

    为什么在java中有这么多获取日期时间的方法?

  11. 11

    为什么会有这么多的符号链接?

  12. 12

    为什么会有这么多sidekiq进程?

  13. 13

    ActionCable:为什么有这么多连接?

  14. 14

    为什么有这么多python版本在使用?

  15. 15

    当您具有“字符串”类型时,为什么ABAP中有这么多“字符”类型?

  16. 16

    为什么OPENCV中有这么多函数使用InputArray和OutputArray作为函数参数?

  17. 17

    为什么OPENCV中有这么多函数使用InputArray和OutputArray作为函数参数?

  18. 18

    当我有这么多RAM时,为什么我的系统这么慢?

  19. 19

    为什么在modules.dep中有这么多条目?

  20. 20

    HTTP / 2的协议ID是什么,为什么有这么多?

  21. 21

    为什么在基础图像上有这么多图层?码头工人

  22. 22

    为什么<h3>和<p>之间有这么多空间

  23. 23

    基本的npm + Webpack:为什么会有这么多模块?

  24. 24

    为什么我会有这么多滞后?

  25. 25

    为什么我有这么多REPOSITORY name = <none>的Docker映像?

  26. 26

    SATA电源连接器上为什么有这么多的针脚?

  27. 27

    为什么会有这么多虚拟终端设备?

  28. 28

    为什么我有这么多ngen.exe进程?

  29. 29

    在UITableView中使用“自动布局”,为什么周围有这么多额外的空间?

热门标签

归档