背景
在某个时间点,我知道我创建了一个文件,该文件定义了一些函数并为它们分配了别名。这些在所有 powershell 实例中都可用。
问题是,现在我想添加更多文件,我无论如何也想不起来这个文件在哪里。
我尝试过的方法
我尝试过Get-Command
,但没有任何有用的输出,我也检查了我的PATH
文件夹,但没有包含该脚本的文件夹 :/
Get-Command
输出:
Get-Command 的输出
用户PATH
:
用户 PATH 位置
系统PATH
系统 PATH 位置
该怎么办?
我如何找到这些别名和函数的定义位置?
答案1
“始终存在”代码的通常来源是其中一个[或多个]配置文件。您可以这样找到它们...
$profile | Select-Object -Property *
由于您在所有主机中都看到了这一点,因此您可能需要检查的是AllUsersAllHosts
ORCurrentUserAllHosts
版本。
配置文件默认不存在,因此您可能找不到任何给定文件。此外,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
。我很确定这是不可能的,除非你对配置文件加载的文件进行文本搜索。