亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PowerShell > 正文

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

2020-03-26 19:11:40
字體:
來源:轉載
供稿:網友

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

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

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

復制代碼 代碼如下:

$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)

 

撇開函數定位的定義,如果我們能回到光標之前出現的位置,那將太漂亮了。實現這個也非常簡單。我們所要做的只是存儲這些行號,然后按照反轉順序反轉他們。(是否有人已經知道了,“堆棧”)

下面的腳本塊展示了展示了Go-To Definition的實現。

復制代碼 代碼如下:

#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)) `
 
–and ($global:__ISEGoToAddOncurrcol -ge
 
$str.IndexOf($_.name)) `
 
-and ($global:__ISEGoToAddOncurrcol -le
 
($str.IndexOf($_.name)+$_.name.length))
 
)
 
{$selectedFunction = $_.name}
 
}
 
if($selectedFunction -ne "")
 
{
 
#See if the selected function exists in the current open file
 
$functionToGoTo = $functionsInFile | ?{$_.name -eq "$selectedFunction"}
 
$global:__ISEGoToAddOnlineToGoTo = $functionToGoTo.Extent.StartLineNumber
 
$global:__ISEGoToAddOncolToGoTo = $functionToGoTo.Extent.StartColumnNumber
 
}
 
if($functionToGoTo -eq $null)
 
{
 
try
 
{
 
$comm = Get-Command -Name "$selectedFunction" -ErrorAction SilentlyContinue
 
$comm.Definition | Out-GridView
 
}
 
catch [System.Exception]
 
{
 
}
 
}
 
else
 
{
 
#Select the function definition, assuming the function name immediately follows the keyword 'function'
 
try
 
{
 
$psise.CurrentFile.Editor.Select($global:__ISEGoToAddOnlineToGoTo,
 
($global:__ISEGoToAddOncolToGoTo+9),
 
$global:__ISEGoToAddOnlineToGoTo,
 
($global:__ISEGoToAddOncolToGoTo+8+$selectedFunction.length+1))
 
}
 
catch [System.Exception]
 
{
 
}
 
}
 
}

 

補充一下,Go-To Definition 功能,如果當前Powershell會話中存在的話,以上腳本會顯示選中文本的定義。(另外,上面的腳本只是一個簡單的例子,假如你的“function”關鍵字和函數名出現在腳本的同一行。這在PowerShell中并不是必須的,所以如果你的腳本風格不同,你可能需要微調一下邏輯。)

接下來應當是在Add-on(附加工具)菜單上添加這些腳本,并把它作為選中腳本的一個命令。下面兩行就可以做這件事。

復制代碼 代碼如下:

$global:__ISEGoToAddOnsb1 =
{& $global:__ISEGoToAddOnscriptBlockGoTo | Out-Null}
$null=$psISE.CurrentPowerShellTab.AddOnsMenu.Submenus.Add(
"Go do definition", $global:__ISEGoToAddOnsb1, "F12")

 

現在來看看我們怎樣實現Go-Back 功能,使用我們定義的全局堆棧,幾行代碼即可:

 

復制代碼 代碼如下:

$global:__ISEGoToAddOnscriptBlockGoBack =
 
{
 
try
 
{
 
#Pop the line and column numbers from the stack to do a reverse traversal
 
$global:__ISEGoToAddOncurrLine =
 
$global:__ISEGoToAddOnstackOfLine.Pop()
 
$global:__ISEGoToAddOncurrcol =
 
$global:__ISEGoToAddOnstackOfCol.Pop()
 
$psISE.CurrentFile.Editor.SetCaretPosition(
 
$global:__ISEGoToAddOncurrLine, $global:__ISEGoToAddOncurrcol)
 
$psISE.CurrentFile.Editor.SelectCaretLine();
 
}
 
catch [System.Exception]
 
{
 
}
 
}
 
$global:__ISEGoToAddOnsb2 = {& $global:__ISEGoToAddOnscriptBlockGoBack | Out-Null}
 
$null=$psISE.CurrentPowerShellTab.AddOnsMenu.Submenus.Add("Go Back",$global:__ISEGoToAddOnsb2, "Shift+F12")

 

就到這里了,只用了一些PowerShell代碼就實現了Visual Studio中的Go-To Definition (轉向定義)和Go-Back(返回)功能。

你還可以繼續擴展這個腳本,讓它包含這些任務:諸如顯示腳本中所有函數,點擊函數轉到函數定義。作為大家進一步擴展功能的鼓勵,我給你看下我的 ISE附加工具現在的樣子。

Powershell,ISE,抽象語法樹

擴展PowerShell ISE 中的 “附加工具”菜單

 
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91亚洲精品在线观看| 国产午夜精品一区二区三区| 亚洲成人aaa| 亚洲成人av片在线观看| 视频在线观看99| 欧美理论电影网| 亚洲女同精品视频| 精品视频久久久久久| 欧美日韩国产丝袜另类| 亚洲欧美国产精品久久久久久久| 国产偷国产偷亚洲清高网站| 日韩高清av在线| 亚洲精品福利视频| 国产精品久久久久久久美男| 国产精品久久久久久久久久新婚| 久久成人精品视频| 日韩成人高清在线| 美女性感视频久久久| 尤物精品国产第一福利三区| 日韩在线视频二区| 在线电影av不卡网址| 国语自产精品视频在线看一大j8| 国产精品久久久久久亚洲调教| 国产日韩专区在线| 久久久久久久激情视频| 91免费看视频.| 亚洲淫片在线视频| 国产激情999| zzjj国产精品一区二区| 亚洲国产精品久久久久秋霞不卡| 亚洲精品www久久久| 正在播放欧美一区| 久久国产精品久久精品| 久久99热精品这里久久精品| 在线精品视频视频中文字幕| 岛国av一区二区三区| 91av在线视频观看| 欧美激情性做爰免费视频| 91香蕉嫩草神马影院在线观看| 久久久久久久久久国产精品| 久久精品久久久久电影| 91视频国产精品| 久久国产精品久久久久久久久久| 成人疯狂猛交xxx| 亚洲裸体xxxx| 国产97免费视| 亚洲精品成人av| 91久久久久久久一区二区| 亚洲精品国产电影| 成人性生交大片免费观看嘿嘿视频| 亚洲xxx大片| 国产精品在线看| 欧美亚洲另类激情另类| 97高清免费视频| 国外成人在线播放| 成人免费视频a| 日韩在线中文视频| 91a在线视频| 一区二区三区www| 亚洲一区二区久久久| www高清在线视频日韩欧美| 亚洲www在线观看| 国产精品成人一区二区三区吃奶| 97热精品视频官网| 日韩av日韩在线观看| 欧美成人免费小视频| 伊人av综合网| 欧美在线性视频| 欧美日韩中国免费专区在线看| 538国产精品一区二区免费视频| 91亚洲一区精品| 九九热在线精品视频| 国产日韩欧美在线观看| 97视频在线观看网址| 欧美精品久久久久久久| 国产99久久精品一区二区 夜夜躁日日躁| 性色av一区二区咪爱| 超碰日本道色综合久久综合| 精品国产老师黑色丝袜高跟鞋| 亚洲国产成人爱av在线播放| 91美女福利视频高清| 日韩av一区在线观看| 日韩美女视频免费看| 国产精品久久久久久亚洲调教| 国产精品男人爽免费视频1| 国产成人免费av电影| 国产精品一区二区av影院萌芽| 中文字幕不卡av| 最近2019年手机中文字幕| 国产91精品高潮白浆喷水| 亚洲xxxx妇黄裸体| 欧美一区二区大胆人体摄影专业网站| 欧美丝袜一区二区| 欧美成人性色生活仑片| 国产成人精品亚洲精品| 97av在线视频免费播放| 亚洲乱码国产乱码精品精| 亚洲国产精品久久久久| 亚洲国产毛片完整版| 精品成人久久av| 亚洲免费小视频| 日本免费在线精品| 日本午夜精品理论片a级appf发布| 国产成人激情视频| 国产xxx69麻豆国语对白| 亚洲午夜色婷婷在线| 91精品免费视频| 国产精品国模在线| 国色天香2019中文字幕在线观看| 久热在线中文字幕色999舞| 国产精品久久久久久久一区探花| 国产伦精品一区二区三区精品视频| 久久全国免费视频| 日韩精品亚洲元码| 欧美床上激情在线观看| 欧美日本高清一区| 欧美丝袜第一区| 欧美日韩xxx| 亚洲国产精品va在看黑人| 国产成人福利网站| 欧美激情va永久在线播放| 亚洲国产福利在线| 精品国产福利在线| 91免费国产视频| 欧美专区中文字幕| 欧美成人在线网站| 国产精品精品视频| 亚洲国内精品在线| 亚洲黄色在线观看| 色综合久久88| 51精品国产黑色丝袜高跟鞋| 日韩成人在线视频网站| 久久人人爽人人爽人人片av高请| 国产97免费视| 国产精品视频专区| 亚洲精品国产精品国自产在线| 日韩电影中文字幕在线观看| 国产91ⅴ在线精品免费观看| 国产精品丝袜久久久久久不卡| 亚洲成人av片| 国产精品1区2区在线观看| 97在线免费视频| 欧美日韩免费区域视频在线观看| 久久香蕉精品香蕉| 96sao精品视频在线观看| 亚洲摸下面视频| 欧美激情精品久久久久久免费印度| 亚洲自拍另类欧美丝袜| 国产日韩换脸av一区在线观看| 国产日韩精品在线播放| 午夜精品福利在线观看| 91沈先生作品| 日韩精品www| 国产精品爱啪在线线免费观看| 亚洲第一视频网站| 亚洲高清福利视频| 日韩在线国产精品| 国产精品视频区| 亚洲的天堂在线中文字幕| 国产精品美女久久久久av超清| 国产精品视频资源| 成人免费大片黄在线播放| 91精品啪在线观看麻豆免费| 亚洲日韩中文字幕在线播放|