Linux 上的 PowerShell 配置文件位置是什么?



在Windows上,不包括ISE或x86,有四(4)个配置文件脚本。

AllUsersAllHosts @ C:Program FilesPowerShell6profile.ps1
AllUsersCurrentHost @ C:Program FilesPowerShell6Microsoft.PowerShell_profile.ps1
CurrentUserAllHosts @ C:UserslitDocumentsPowerShellprofile.ps1
CurrentUserCurrentHost @ C:UserslitDocumentsPowerShellMicrosoft.PowerShell_profile.ps1

在带有 pwsh 6.2.0 的 Linux 上,我只能找到两个位置。

CurrentUserAllHosts @ ~/.config/powershell/Microsoft.PowerShell_profile.ps1
CurrentUserCurrentHost @ ~/.config/powershell/profile.ps1

Linux 上是否有任何"AllUsers"配置文件脚本?如果是这样,它们在哪里?

tl;dr(也适用于Windows):

  • 概念性about_Profiles帮助主题介绍了 PowerShell 的配置文件(初始化文件)。

  • 自动$PROFILE变量包含一个字符串,该字符串当前用户当前 PowerShell 主机环境(通常为终端又称控制台)的初始化文件的路径。

  • 定义了其他配置文件 - 沿着 (a) 所有用户与当前用户和 (b) 所有主机环境与当前主机环境的维度 - 这些文件通过$PROFILE字符串变量装饰的属性公开,这使得它们易于发现 - 见下文。

  • 默认情况下,没有任何配置文件存在,在某些情况下,甚至它们的父目录也可能不存在;此答案的底部显示了$PROFILE文件的编程按需创建和更新。


Olaf 在评论中提供了关键的指针:

$PROFILE | select *  # short for: $profile | Select-Object -Property *

显示所有配置文件位置,无论单个配置文件是否存在

例如,在我的 Ubuntu 机器上安装了 PowerShell 在/home/jdoe/.powershell中,我得到:

AllUsersAllHosts       : /home/jdoe/.powershell/profile.ps1
AllUsersCurrentHost    : /home/jdoe/.powershell/Microsoft.PowerShell_profile.ps1
CurrentUserAllHosts    : /home/jdoe/.config/powershell/profile.ps1
CurrentUserCurrentHost : /home/jdoe/.config/powershell/Microsoft.PowerShell_profile.ps1
Length                 : 62

请注意[string]类型的本机Length属性的存在,如果改用
$PROFILE | select *host*,则可以省略该属性。

你可以以这种方式获得配置文件位置并不明显,因为$PROFILE是一个字符串变量(类型[string]).
PowerShell用反映所有配置文件位置的NoteProperty成员装饰该[string]实例,这就是为什么select(Select-Object)能够提取它们的原因。

仅输出$PROFILE- 即字符串值- 产生/home/jdoe/.config/powershell/Microsoft.PowerShell_profile.ps1,即与其CurrentUserCurrentHost属性相同的路径,即特定于当前PowerShell主机环境(通常是终端又名控制台)的用户特定配置文件的路径。[1]

您可以使用反射验证这些属性是否存在,如下所示(这也会显示它们的值):

$PROFILE | Get-Member -Type NoteProperty

这意味着您还可以使用常规属性访问Tab 补全来检索单个配置文件位置;例如:

# Use tab-completion to find a specific profile location.
# Expands to .Length first, then cycles through the profile-location properties.
$profile.<tab>  
# Open the all-users, all-hosts profiles for editing.
# Note: Only works if the file already exists.
#       Also, you must typically run as admin to modify all-user profiles.
Invoke-Item $profile.AllUsersAllHosts

用于

获取配置文件位置和打开配置文件进行编辑的便捷功能:

下面的代码定义了:

  • Get-Profile枚举配置文件,显示它们的位置以及它们是否存在于给定的计算机上。

  • Edit-Profile打开配置文件进行编辑(使用-Force按需创建配置文件);请注意,修改所有用户配置文件通常需要以管理员身份运行。

function Get-Profile {
<#
.SYNOPSIS
Gets the location of PowerShell profile files and shows whether they exist.
#>
[CmdletBinding(PositionalBinding=$false)]
param (
[Parameter(Position=0)]
[ValidateSet('AllUsersAllHosts', 'AllUsersCurrentHost', 'CurrentUserAllHosts', 'CurrentUserCurrentHost')]
[string[]] $Scope
)

if (-not $Scope) {
$Scope = 'AllUsersAllHosts', 'AllUsersCurrentHost', 'CurrentUserAllHosts', 'CurrentUserCurrentHost'
}
foreach ($thisScope in $Scope) {
[pscustomobject] @{
Scope = $thisScope
FilePath = $PROFILE.$thisScope
Exists = (Test-Path -PathType Leaf -LiteralPath $PROFILE.$thisScope)
}
}
}
function Edit-Profile {
<#
.SYNOPSIS
Opens PowerShell profile files for editing. Add -Force to create them on demand.
#>
[CmdletBinding(PositionalBinding=$false, DefaultParameterSetName='Select')]
param (
[Parameter(Position=0, ValueFromPipelineByPropertyName, ParameterSetName='Select')]
[ValidateSet('AllUsersAllHosts', 'AllUsersCurrentHost', 'CurrentUserAllHosts', 'CurrentUserCurrentHost')]
[string[]] $Scope = 'CurrentUserCurrentHost'
,
[Parameter(ParameterSetName='All')]
[switch] $All
,
[switch] $Force
)
begin {
$scopes = New-Object Collections.Generic.List[string]
if ($All) {
$scopes = 'AllUsersAllHosts', 'AllUsersCurrentHost', 'CurrentUserAllHosts', 'CurrentUserCurrentHost'
}
}  
process {
if (-not $All) { $scopes.Add($Scope) }
}
end {
$filePaths = foreach ($sc in $scopes) { $PROFILE.$sc }
$extantFilePaths = foreach ($filePath in $filePaths) {
if (-not (Test-Path -LiteralPath $filePath)) {
if ($Force) {
if ((New-Item -Force -Type Directory -Path (Split-Path -LiteralPath $filePath)) -and (New-Item -Force -Type File -Path $filePath)) {
$filePath
}
} else {
Write-Verbose "Skipping nonexistent profile: $filePath"
}
} else {
$filePath
}
}
if ($extantFilePaths.Count) {
Write-Verbose "Opening for editing: $extantFilePaths"
Invoke-Item -LiteralPath $extantFilePaths
} else {
Write-Warning "The implied or specified profile file(s) do not exist yet. To force their creation, pass -Force."
}
}
}

[1] PowerShell 将当前用户、当前主机配置文件视为感兴趣的配置文件,这就是$PROFILE的字符串值包含该的原因。请注意,为了使用 note 属性装饰[string]实例,仅Add-Member是不够的;您必须使用以下习惯用法:$decoratedString = $string | Add-Member -PassThru propName propValue- 请参阅Add-Member帮助主题。

相关内容

  • 没有找到相关文章

最新更新