如何在 PowerShell ISE 中实施
How to Go To Implementation in PowerShell ISE
当 PowerShell 脚本位于多个文件中时,很难理解要在哪个文件中搜索特定功能的实现。怎样才能快速的去执行某个特定的函数进行编辑?如果在 PowerShell ISE 中将光标放在函数上并通过快捷方式转到函数的实现 - 这将是最好的解决方案。
此命令return文件路径:
${Function:Verb-MyCommand}.File
然后我可以在这个文件中搜索函数的名称。
但是很慢
您需要在 PowerShell ISE 中 运行 此代码。附加组件将使用快捷方式 "CTRL + Alt + SHIFT + B" 添加。如果您将光标放在脚本编辑器中的函数上,然后从菜单中的附加组件列表中按 "CTRL + Alt + SHIFT + B" 或 select - 所需文件将在 PowerShell ISE 中打开,光标将移至此函数的开头。
function Get-TokenInfo
{
[Alias("ti")]
[OutputType([System.Management.Automation.PSToken[]])]
Param()
Process
{
$editor = $psise.CurrentFile.Editor;
$line = $editor.CaretLine;
$column = $editor.CaretColumn;
return [system.management.automation.psparser]::Tokenize($psISE.CurrentFile.Editor.Text, [ref]$null) |?{$_.StartLine -le $line -and $_.EndLine -ge $line -and $_.StartColumn -le $column -and $_.EndColumn -ge $column};
}
}
function GoTo-CommandImplementation
{
[Alias("gti")]
Param()
Process
{
$commandInfo = ti |?{$_.Type -eq [System.Management.Automation.PSTokenType]::Command} | select -First 1;
if(!$commandInfo)
{
Write-Host "Is not a command";
}
else
{
$commandName = $commandInfo.Content;
$command = Get-Command $commandName;
if($command -is [System.Management.Automation.AliasInfo])
{
$command = $command.ResolvedCommand;
}
if($command.CommandType -eq [System.Management.Automation.CommandTypes]::Function)
{
$functionInfo = [System.Management.Automation.FunctionInfo]$command;
$commandFile = $functionInfo.ScriptBlock.File;
$line = $functionInfo.ScriptBlock.StartPosition.StartLine;
$column = $functionInfo.ScriptBlock.StartPosition.StartColumn;
psedit $commandFile;
$psise.CurrentFile.Editor.Focus();
$psise.CurrentFile.Editor.SetCaretPosition($line, $column);
}
else
{
Write-Host "Is not Function.";
}
}
}
}
$PowerPSISERoot.Submenus.Add("GoTo Implementation", {gti}, "CTRL+Alt+SHIFT+B");
当 PowerShell 脚本位于多个文件中时,很难理解要在哪个文件中搜索特定功能的实现。怎样才能快速的去执行某个特定的函数进行编辑?如果在 PowerShell ISE 中将光标放在函数上并通过快捷方式转到函数的实现 - 这将是最好的解决方案。
此命令return文件路径:
${Function:Verb-MyCommand}.File
然后我可以在这个文件中搜索函数的名称。
但是很慢
您需要在 PowerShell ISE 中 运行 此代码。附加组件将使用快捷方式 "CTRL + Alt + SHIFT + B" 添加。如果您将光标放在脚本编辑器中的函数上,然后从菜单中的附加组件列表中按 "CTRL + Alt + SHIFT + B" 或 select - 所需文件将在 PowerShell ISE 中打开,光标将移至此函数的开头。
function Get-TokenInfo
{
[Alias("ti")]
[OutputType([System.Management.Automation.PSToken[]])]
Param()
Process
{
$editor = $psise.CurrentFile.Editor;
$line = $editor.CaretLine;
$column = $editor.CaretColumn;
return [system.management.automation.psparser]::Tokenize($psISE.CurrentFile.Editor.Text, [ref]$null) |?{$_.StartLine -le $line -and $_.EndLine -ge $line -and $_.StartColumn -le $column -and $_.EndColumn -ge $column};
}
}
function GoTo-CommandImplementation
{
[Alias("gti")]
Param()
Process
{
$commandInfo = ti |?{$_.Type -eq [System.Management.Automation.PSTokenType]::Command} | select -First 1;
if(!$commandInfo)
{
Write-Host "Is not a command";
}
else
{
$commandName = $commandInfo.Content;
$command = Get-Command $commandName;
if($command -is [System.Management.Automation.AliasInfo])
{
$command = $command.ResolvedCommand;
}
if($command.CommandType -eq [System.Management.Automation.CommandTypes]::Function)
{
$functionInfo = [System.Management.Automation.FunctionInfo]$command;
$commandFile = $functionInfo.ScriptBlock.File;
$line = $functionInfo.ScriptBlock.StartPosition.StartLine;
$column = $functionInfo.ScriptBlock.StartPosition.StartColumn;
psedit $commandFile;
$psise.CurrentFile.Editor.Focus();
$psise.CurrentFile.Editor.SetCaretPosition($line, $column);
}
else
{
Write-Host "Is not Function.";
}
}
}
}
$PowerPSISERoot.Submenus.Add("GoTo Implementation", {gti}, "CTRL+Alt+SHIFT+B");