Powershell - 如何找到别名和函数的定义位置?

Powershell - 如何找到别名和函数的定义位置?

背景

在某个时间点,我知道我创建了一个文件,该文件定义了一些函数并为它们分配了别名。这些在所有 powershell 实例中都可用。

问题是,现在我想添加更多文件,我无论如何也想不起来这个文件在哪里。

我尝试过的方法

我尝试过Get-Command,但没有任何有用的输出,我也检查了我的PATH文件夹,但没有包含该脚本的文件夹 :/

Get-Command输出: Get-Command 的输出

用户PATH用户 PATH 位置

系统PATH 系统 PATH 位置

该怎么办?

我如何找到这些别名和函数的定义位置?

答案1

“始终存在”代码的通常来源是其中一个[或多个]配置文件。您可以这样找到它们...

$profile | Select-Object -Property *

由于您在所有主机中都看到了这一点,因此您可能需要检查的是AllUsersAllHostsORCurrentUserAllHosts版本。

配置文件默认不存在,因此您可能找不到任何给定文件。此外,ps5.1 与 ps7 以及每个主机的文件列表各不相同 [ISE/powershell.exe/pwsh.exe/VSCode_PoSh_addon/etc] ...因此您需要检查特定于每个主机的版本 - 并从每个主机内部执行此操作。

我的 ps5.1 在 ISE 内部列出......

AllUsersAllHosts       : C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1
AllUsersCurrentHost    : C:\Windows\System32\WindowsPowerShell\v1.0\Microsoft.PowerShellISE_profile.ps1
CurrentUserAllHosts    : D:\Data\Documents\WindowsPowerShell\profile.ps1
CurrentUserCurrentHost : D:\Data\Documents\WindowsPowerShell\Microsoft.PowerShellISE_profile.ps1
Length                 : 71

请注意,我已重定向我的MyDocuments目录。[咧嘴笑]

对于 ps7,列表如下...

AllUsersAllHosts       : C:\Program Files\PowerShell\7\profile.ps1
AllUsersCurrentHost    : C:\Program Files\PowerShell\7\Microsoft.PowerShell_profile.ps1
CurrentUserAllHosts    : D:\Data\Documents\PowerShell\profile.ps1
CurrentUserCurrentHost : D:\Data\Documents\PowerShell\Microsoft.PowerShell_profile.ps1
Length                 : 61

请注意前两个个人资料列表中的不同位置。

答案2

Lee_Dailey 在给您的最后一条评论中表达了什么。

不过,这里还有其他几种可用于发现的方法。好吧,设置默认值,然后与会话创建的内容进行比较,然后从两者中获取详细信息。这也可以用于会话清理。

# Collect all automatic environment resources
$AutomaticVariables    = Get-Variable
$AutomaticVModules     = Get-Module
$AutomaticAliases      = Get-Alias
$AutomaticApplications = Get-Command -CommandType Application
$AutomaticCmdlets      = Get-Command -CommandType Cmdlet
$AutomaticFunctions    = Get-Command -CommandType Function

需要注意的是,这样做确实需要花费一些时间来收集所有信息,因此会减慢您的 $profile 加载时间。

但是,您可以根据需要查找此信息,例如:

# Get details about a selection
$AutomaticAliases.SyncRoot | 
Out-GridView -PassThru | 
Select-Object -Property '*' | 
Format-List -Force

After making a selection from the grid, in this case an alias from the Pester module:

# Results
<#
HelpUri             : https://sites.google.com/site/unclebobconsultingllc/the-truth-about-bdd
ResolvedCommandName : GherkinStep
DisplayName         : Given -> GherkinStep
ReferencedCommand   : GherkinStep
ResolvedCommand     : GherkinStep
Definition          : GherkinStep
Options             : None
Description         : 
OutputType          : {}
Name                : Given
CommandType         : Alias
Source              : Pester
Version             : 4.10.1
Visibility          : Public
ModuleName          : Pester
Module              : Pester
RemotingCapability  : PowerShell
Parameters          : {[Name, System.Management.Automation.ParameterMetadata], [Test, System.Management.Automation.ParameterMetadata], [Verbose, 
                      System.Management.Automation.ParameterMetadata], [Debug, System.Management.Automation.ParameterMetadata], [ErrorAction, 
                      System.Management.Automation.ParameterMetadata], [WarningAction, System.Management.Automation.ParameterMetadata], [InformationAction, 
                      System.Management.Automation.ParameterMetadata], [ErrorVariable, System.Management.Automation.ParameterMetadata], [WarningVariable, 
                      System.Management.Automation.ParameterMetadata], [InformationVariable, System.Management.Automation.ParameterMetadata], [OutVariable, 
                      System.Management.Automation.ParameterMetadata], [OutBuffer, System.Management.Automation.ParameterMetadata], [PipelineVariable, 
                      System.Management.Automation.ParameterMetadata]}
ParameterSets       : 
#>

或使用 Get-Member 从选择

$AutomaticAliases.SyncRoot | 
Out-GridView -PassThru | 
Select-Object -Property '*' | 
Get-Member | 
Format-List -Force

或这个...

($AutomaticAliases.SyncRoot | 
Out-GridView -PassThru | 
Select-Object -Property '*').PSObject.Properties

比如说,一旦你知道别名在哪个模块(或其他什么)中,那么就执行以下操作:

Get-Module -Name $($AutomaticAliases.SyncRoot | 
Out-GridView -PassThru).Source | 
Select-Object -Property Name, Path
# Results
<#
Name   Path                                                                         
----   ----                                                                         
Pester C:\Users\postanote\Documents\WindowsPowerShell\Modules\Pester\4.10.1\Pester.psm1
#>

最后,如上所述,仅获取您在当前会话中创建的内容,然后以类似的方式挖掘这些细节。

# Get only variables created/used during the session
Compare-Object -ReferenceObject (Get-Variable) -DifferenceObject $AutomaticVariables -Property Name -PassThru |
Where -Property Name -ne 'AutomaticVariables' | 
Out-GridView -Title 'variables created/used during the session' -PassThru

# Get only modules loaded during the session
Compare-Object -ReferenceObject (Get-Module) -DifferenceObject $AutomaticVModules -Property Name -PassThru |
Where -Property Name -ne 'AutomaticVModules' | 
Out-GridView -Title 'modules created/used during the session' -PassThru

# Get only aliases loaded during the session
Compare-Object -ReferenceObject (Get-Alias) -DifferenceObject $AutomaticAliases -Property Name -PassThru |
Where -Property Name -ne 'AutomaticAliases' | 
Out-GridView -Title 'variables created/used during the session' -PassThru

# Get only applicatrions loaded during the session
Compare-Object -ReferenceObject (Get-Command -CommandType Function) -DifferenceObject $AutomaticApplications  -Property Name -PassThru |
Where -Property Name -ne 'AutomaticApplications' | 
Out-GridView -Title 'variables created/used during the session' -PassThru

# Get only cmdlets loaded during the session
Compare-Object -ReferenceObject (Get-Command -CommandType Function) -DifferenceObject $AutomaticCmdlets  -Property Name -PassThru |
Where -Property Name -ne 'AutomaticCmdlets' | 
Out-GridView -Title 'variables created/used during the session' -PassThru

# Get only functions loaded during the session
Compare-Object -ReferenceObject (Get-Command -CommandType Function) -DifferenceObject $AutomaticFunctions  -Property Name -PassThru |
Where -Property Name -ne 'AutomaticFunctions' | 
Out-GridView -Title 'variables created/used during the session' -PassThru

如果你不想执行上述所有操作,也可以使用 PSDrives 来获取此信息。例如:

Get-PSDrive | Format-Table -AutoSize
# Results
<#

Name     Used (GB) Free (GB) Provider    Root                CurrentLocation
----     --------- --------- --------    ----                ---------------
Alias                        Alias                                          
C           182.46    293.27 FileSystem  C:\                WINDOWS\system32
Cert                         Certificate \                                  
...                               
Env                          Environment                                    
...                              
Function                     Function                                       
HKCU                         Registry    HKEY_CURRENT_USER                  
HKLM                         Registry    HKEY_LOCAL_MACHINE                 
...                              
Variable                     Variable                                       
...                                      
#>

Get-ChildItem -Path 'Alias:\' | 
Select-Object -Property Name, Source, PSPRovider, PSPath | 
Format-Table -AutoSize
# Results
<#
Name               Source                          PSProvider                      PSPath                                             
----               ------                          ----------                      ------                                             
%                                                  Microsoft.PowerShell.Core\Alias Microsoft.PowerShell.Core\Alias::%                 
?                                                  Microsoft.PowerShell.Core\Alias Microsoft.PowerShell.Core\Alias::?                 
__                 PSKoans                         Microsoft.PowerShell.Core\Alias Microsoft.PowerShell.Core\Alias::__                
____               PSKoans                         Microsoft.PowerShell.Core\Alias Microsoft.PowerShell.Core\Alias::____              
ac                                                 Microsoft.PowerShell.Core\Alias Microsoft.PowerShell.Core\Alias::ac                
Add-ShouldOperator Pester                          Microsoft.PowerShell.Core\Alias Microsoft.PowerShell.Core\Alias::Add-ShouldOperator
alco               ModuleLibrary                   Microsoft.PowerShell.Core\Alias Microsoft.PowerShell.Core\Alias::alco   
...
#>

Get-ChildItem -Path 'Function:\'  | 
Select-Object -Property Name, Source, PSPRovider, PSPath | 
Format-Table -AutoSize
<#
Name                                   Source                       PSProvider                         PSPath                                                      
----                                   ------                       ----------                         ------                                                      
A:                                                                  Microsoft.PowerShell.Core\Function Microsoft.PowerShell.Core\Function::A:                      
Add-AssertionOperator                  Pester                       Microsoft.PowerShell.Core\Function Microsoft.PowerShell.Core\Function::Add-AssertionOperator   
Add-MenuItem                           PSharp                       Microsoft.PowerShell.Core\Function Microsoft.PowerShell.Core\Function::Add-MenuItem            
Add-SubMenuItem                        PSharp                       Microsoft.PowerShell.Core\Function Microsoft.PowerShell.Core\Function::Add-SubMenuItem         
AfterAll                               Pester                       Microsoft.PowerShell.Core\Function Microsoft.PowerShell.Core\Function::AfterAll                
AfterEach                              Pester                       Microsoft.PowerShell.Core\Function Microsoft.PowerShell.Core\Function::AfterEach               
AfterEachFeature                       Pester                       Microsoft.PowerShell.Core\Function Microsoft.PowerShell.Core\Function::AfterEachFeature        
AfterEachScenario                      Pester                       Microsoft.PowerShell.Core\Function Microsoft.PowerShell.Core\Function::AfterEachScenario 
Assert-FolderExists                    ModuleLibrary                Microsoft.PowerShell.Core\Function Microsoft.PowerShell.Core\Function::Assert-FolderExists 
...
#>

答案3

获取定义文件功能使用 很简单FunctionInfo.ScriptBlock。下面是我如何找到md函数的定义:

(v) ➜ ~ Get-Command md

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Function        md

(v) ➜ ~ (Get-Command md).ScriptBlock.File
/Users/walshca/OneDrive/bin/Microsoft.PowerShell_profile.ps1
(v) ➜ ~

我不确定是否有可能从中找到定义别名的文件AliasInfo。我很确定这是不可能的,除非你对配置文件加载的文件进行文本搜索。

相关内容