当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 自定义您的 shell 环境

作者:精品下载站 日期:2024-12-14 03:04:44 浏览:14 分类:玩电脑

自定义您的 shell 环境


PowerShell 配置文件是在 PowerShell 启动时运行的脚本。您可以使用配置文件来自定义环境。你可以:

  • 添加别名、函数和变量
  • 加载模块
  • 创建 PowerShell 驱动器
  • 运行任意命令
  • 并更改首选项设置

将这些设置放入您的配置文件中可确保每当您在系统上启动 PowerShell 时它们都可用。

笔记

要在 Windows 中运行脚本,PowerShell 执行策略至少需要设置为 RemoteSigned。执行策略不适用于 macOS 和 Linux。有关详细信息,请参阅 about_Execution_Policy。

$PROFILE 变量

$PROFILE 自动变量存储当前会话中可用的 PowerShell 配置文件的路径。

有四种可能的配置文件可用于支持不同的用户范围和不同的 PowerShell 主机。每个配置文件脚本的完全限定路径存储在 $PROFILE 的以下成员属性中。

  • 所有用户所有主机
  • 所有用户当前主机
  • 当前用户所有主机
  • 当前用户当前主机

您可以创建为所有用户或仅为一个用户(CurrentUser)运行的配置文件脚本。 当前用户配置文件存储在用户的主目录中。

还有针对所有 PowerShell 主机或特定主机运行的配置文件。每个 PowerShell 主机的配置文件脚本都有一个该主机唯一的名称。例如,Windows 上的标准控制台主机或其他平台上的默认终端应用程序的文件名是 Microsoft.PowerShell_profile.ps1。对于 Visual Studio Code (VS Code),文件名为 Microsoft.VSCode_profile.ps1

有关详细信息,请参阅 about_Profiles。

默认情况下,引用 $PROFILE 变量会返回“当前用户、当前主机”配置文件的路径。其他配置文件路径可以通过 $PROFILE 变量的属性访问。例如:

PS> $PROFILE
C:\Users\user1\Documents\PowerShell\Microsoft.PowerShell_profile.ps1
PS> $PROFILE.AllUsersAllHosts
C:\Program Files\PowerShell\profile.ps1

如何创建您的个人资料

当您首次在系统上安装 PowerShell 时,配置文件脚本文件及其所属目录不存在。以下命令将创建“当前用户、当前当前主机”配置文件脚本文件(如果不存在)。

if (!(Test-Path -Path $PROFILE)) {
  New-Item -ItemType File -Path $PROFILE -Force
}

当必要的文件夹不存在时,New-Item cmdlet 的 Force 参数会创建这些文件夹。创建脚本文件后,您可以使用您喜欢的编辑器来自定义您的 shell 环境。

将自定义添加到您的个人资料

前面的文章讨论了使用制表符补全、命令预测器和别名。这些文章展示了用于加载所需模块、创建自定义完成器、定义键绑定和其他设置的命令。这些是您希望在每个 PowerShell 交互式会话中可用的自定义类型。配置文件脚本是这些设置的地方。

编辑配置文件脚本的最简单方法是在您喜欢的代码编辑器中打开文件。例如,以下命令在 VS Code 中打开配置文件。

code $PROFILE

您还可以在 Windows 上使用 notepad.exe、在 Linux 上使用 vi 或任何其他文本编辑器。

以下配置文件脚本包含前面文章中提到的许多自定义的示例。您可以在自己的个人资料中使用任何这些设置。

## Map PSDrives to other registry hives
if (!(Test-Path HKCR:)) {
    $null = New-PSDrive -Name HKCR -PSProvider Registry -Root HKEY_CLASSES_ROOT
    $null = New-PSDrive -Name HKU -PSProvider Registry -Root HKEY_USERS
}

## Customize the prompt
function prompt {
    $identity = [Security.Principal.WindowsIdentity]::GetCurrent()
    $principal = [Security.Principal.WindowsPrincipal] $identity
    $adminRole = [Security.Principal.WindowsBuiltInRole]::Administrator

    $prefix = $(if (Test-Path variable:/PSDebugContext) { '[DBG]: ' }
                elseif ($principal.IsInRole($adminRole)) { "[ADMIN]: " }
                else { '' })
    $body = 'PS ' + $(Get-Location)
    $suffix = $(if ($NestedPromptLevel -ge 1) { '>>' }) + '> '
    $prefix + $body + $suffix
}

## Create $PSStyle if running on a version older than 7.2
## - Add other ANSI color definitions as needed

if ($PSVersionTable.PSVersion.ToString() -lt '7.2.0') {
    # define escape char since "`e" may not be supported
    $esc = [char]0x1b
    $PSStyle = [pscustomobject]@{
        Foreground = @{
            Magenta = "${esc}[35m"
            BrightYellow = "${esc}[93m"
        }
        Background = @{
            BrightBlack = "${esc}[100m"
        }
    }
}

## Set PSReadLine options and keybindings
$PSROptions = @{
    ContinuationPrompt = '  '
    Colors             = @{
        Operator         = $PSStyle.Foreground.Magenta
        Parameter        = $PSStyle.Foreground.Magenta
        Selection        = $PSStyle.Background.BrightBlack
        InLinePrediction = $PSStyle.Foreground.BrightYellow + $PSStyle.Background.BrightBlack
    }
}
Set-PSReadLineOption @PSROptions
Set-PSReadLineKeyHandler -Chord 'Ctrl+f' -Function ForwardWord
Set-PSReadLineKeyHandler -Chord 'Enter' -Function ValidateAndAcceptLine

## Add argument completer for the dotnet CLI tool
$scriptblock = {
    param($wordToComplete, $commandAst, $cursorPosition)
    dotnet complete --position $cursorPosition $commandAst.ToString() |
        ForEach-Object {
            [System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_)
        }
}
Register-ArgumentCompleter -Native -CommandName dotnet -ScriptBlock $scriptblock

此配置文件脚本提供了以下自定义的示例:

  • 为其他根注册表配置单元添加两个新的 PSDrive。
  • 创建自定义提示,如果您在提升的会话中运行,该提示会发生变化。
  • 配置 PSReadLine 并添加键绑定。颜色设置使用 $PSStyle 功能来定义 ANSI 颜色设置。
  • 为 dotnet CLI 工具添加制表符补全。该工具提供参数来帮助解析命令行参数。 Register-ArgumentCompleter 的脚本块使用该功能来提供制表符完成功能。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯