麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發(fā) > PowerShell > 正文

Powershell ISE的抽象語法樹編程示例

2020-10-29 20:59:09
字體:
供稿:網(wǎng)友

有一個(gè)讓我非常喜歡Windows PowerShell ISE的理由,就是它將它的基礎(chǔ)腳本對(duì)象模型暴露給用戶,這樣就允許用戶按照自己的方式和需要去自定義腳本體驗(yàn)。
自定義ISE的核心是$psISE對(duì)象。$psISE對(duì)象允許用戶去控制ISE許多方面的功能。你可以從這里獲取關(guān)于$psISE的分層對(duì)象模型的介紹,和與這些對(duì)象相關(guān)聯(lián)的功能。

這篇文章會(huì)討論你怎樣利用PowerShell公開提供的解釋器接口,來結(jié)合ISE對(duì)象模型魅力,去創(chuàng)建腳本分析和快速定位的工具。

想象一下,你不得不分析一個(gè)相對(duì)龐大的PowerShell腳本。那這個(gè)腳本可能是別人寫的,也有可能是你自己幾個(gè)月前寫的,扔了好久了。PowerShell ISE已經(jīng)做了件非常棒的工作了,它提供了腳本環(huán)境。你可以通過添加Add-On(附加工具)來擴(kuò)充它的功能,讓你的腳本體驗(yàn)更好,更高效。從PowerShell 3.0開始,腳本的抽象語法樹(AST)就可以使用語法解釋器接口非常方便的獲取了。下面的腳本行會(huì)獲取當(dāng)前打開的ISE中的腳本的AST:

復(fù)制代碼 代碼如下:

$AbstractSyntaxTree = [System.Management.Automation.Language.Parser]::
ParseInput($psISE.CurrentFile.Editor.Text, [ref]$null, [ref]$null)

接下來讓我們查詢腳本中所有的函數(shù):

復(fù)制代碼 代碼如下:

$functionsInFile = $AbstractSyntaxTree.FindAll({$args[0] -is
 [System.Management.Automation.Language.FunctionDefinitionAst]}, $true)

撇開函數(shù)定位的定義,如果我們能回到光標(biāo)之前出現(xiàn)的位置,那將太漂亮了。實(shí)現(xiàn)這個(gè)也非常簡(jiǎn)單。我們所要做的只是存儲(chǔ)這些行號(hào),然后按照反轉(zhuǎn)順序反轉(zhuǎn)他們。(是否有人已經(jīng)知道了,“堆棧”)

下面的腳本塊展示了展示了Go-To Definition的實(shí)現(xiàn)。

復(fù)制代碼 代碼如下:

#Define some useful global variables
 
$global:__ISEGoToAddOncurrLine=1
 
$global:__ISEGoToAddOncurrcol=1
 
$global:__ISEGoToAddOnlineToGoTo=1
 
$global:__ISEGoToAddOncolToGoTo=1
 
#We need two stacks - one each for line and column
 
$global:__ISEGoToAddOnstackOfLine = New-Object System.Collections.Stack
 
$global:__ISEGoToAddOnstackOfCol = New-Object System.Collections.Stack
 
#This script block has the logic for the implementation of the Go-To definition functionality
 
$global:__ISEGoToAddOnscriptBlockGoTo =
 
{
 
$AbstractSyntaxTree =[System.Management.Automation.Language.Parser]::ParseInput($psISE.CurrentFile.Editor.Text,[ref]$null, [ref]$null)
 
$functionsInFile = $AbstractSyntaxTree.FindAll(
 
{$args[0] -is[System.Management.Automation.Language.FunctionDefinitionAst]}, $true)
 
#Get the text of the line where we have the cursor
 
$str = $psISE.CurrentFile.Editor.CaretLineText
 
#Store them on the stack for later use
 
$global:__ISEGoToAddOnstackOfLine.Push($psISE.CurrentFile.Editor.CaretLine)
 
$global:__ISEGoToAddOnstackOfCol.Push($psISE.CurrentFile.Editor.CaretColumn)
 
$global:__ISEGoToAddOncurrLine = $global:__ISEGoToAddOnstackOfLine.Peek()
 
$global:__ISEGoToAddOncurrcol = $global:__ISEGoToAddOnstackOfCol.Peek()
 
#Get the selected text so that it can be used for searching existing functions
 
$selectedFunction = $psISE.CurrentFile.Editor.SelectedText
 
#Ensure that the cursor is somewhere between the word boundaries of the function
 
$functionsInFile | %{if(($str.Contains($_.name)) `
 
主站蜘蛛池模板: 色七七网站 | 亚洲国产精久久久久久久 | 精品久久久久久亚洲精品 | 国产精品99精品 | 午夜视频在线免费观看 | 日本成人在线播放 | 在线视频 欧美日韩 | 毛片一级网站 | 国产精品久久久久久久不卡 | 特级黄色一级毛片 | 99re热精品视频 | 人成久久 | 日韩av电影免费在线观看 | 女18一级大黄毛片免费女人 | 亚洲最新黄色网址 | 亚洲精品一区二区三区在线看 | 91羞羞| 亚洲第一激情 | 欧美在线观看视频一区二区 | 91丝袜| 一区二区三区视频在线观看 | 欧美成网站 | 俄罗斯hdxxx| 曰批全过程40分钟免费视频多人 | 精品一区二区免费 | 国产午夜精品理论片a级探花 | v天堂在线视频 | 日本欧美一区二区三区在线观看 | 国产成人精品免费视频大全最热 | 国产精品亚洲欧美一级在线 | 五月天影院,久久综合, | 久久精品视频69 | 免费一级欧美大片视频在线 | hd日本xxxx| 一区二区美女视频 | 国产精品一区二av18款 | 九九热视频这里只有精品 | 一区二区三区日韩在线 | 免费视频www在线观看 | 午夜精品久久久久久中宇 | 日韩美女电影 |