powershell@命令行提示符样式配置自定义@pwsh重写prompt显示电量内存时间等信息

news/2024/5/19 14:53:37

文章目录

    • abstract
      • 流行的powershell prompt模块
      • 示例
    • powershell原生修改Prompt函数
      • 配置文档
      • Prompt命令来自哪里
    • 简单修改
      • 带上电量和时间的Prompt
    • 复杂修改
      • 预览
      • FAQ:没有必要修改
      • 相关仓库地址
      • 样式选择
      • 平衡样式
      • 花哨样式
      • 响应性能
    • 小结

abstract

  • 在 PowerShell 中,可以通过自定义 $prompt 变量来修改命令行提示符(Prompt)。以下是修改 PowerShell 提示符的一些基本方式:

    1. 简单修改
      你可以直接覆盖 $prompt 变量的内容,例如将其设为任何你想要的文字:

      $prompt = "Hello, World PS> "
      
    2. 动态提示符
      利用 PowerShell 表达式来构造动态提示符,例如包含当前目录、时间戳或用户名等信息:

      function prompt {"$([System.Environment]::UserName) at $(Get-Location): $(Get-Date -Format 'HH:mm:ss') > "
      }
      
    3. 颜色和样式
      使用 ANSI 转义码或 PowerShell 的 Write-Host 命令配合特殊字符来实现颜色和样式变化:

      function prompt {Write-Host -ForegroundColor Green -NoNewline "[ $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') ]"Write-Host -ForegroundColor DarkCyan -NoNewline "($(Get-Location)) "return ">"
      }
      

流行的powershell prompt模块

  1. 使用 PowerShell 模块
    有一些社区开发的 PowerShell 模块,如 posh-git 和 oh-my-posh,专门用于增强和美化 PowerShell 提示符,尤其是针对 Git 用户,它们会在提示符中显示 Git 仓库的状态。

  2. 定制复杂的提示符
    你还可以根据自己的需求编写更为复杂的函数来定制提示符,它可以包含各种环境信息、快捷菜单项、甚至是图形元素(如在 Windows Terminal 应用中)。

示例

function prompt {$GitStatus = git status --porcelain 2>$null$Branch = git rev-parse --abbrev-ref HEAD 2>$nullif ($LASTEXITCODE -eq 0) {"$([char]0x1b)[32m[$Branch]$([char]0x1b)[0m$(if ($GitStatus) {' *'}) $($pwd.ProviderPath)\>"} else {"PS $($pwd.Path)>"}
}

以上示例尝试获取 Git 分支信息并检查是否有未提交的更改,从而在提示符中显示 Git 相关状态。

请注意,对于不同版本的 PowerShell (尤其是跨平台的 PowerShell Core),提示符的定制可能会有所差异,需确保代码兼容对应的 PowerShell 版本。同时,为了防止与其他脚本冲突,建议在用户的配置文件(如 Microsoft.PowerShell_profile.ps1)中进行个性化提示符的设置。

powershell原生修改Prompt函数

  • 通过重写prompt来修改powershell命令行提示符的样式👺

  • 本方案不需要第三方模块,但是需要自己编写和设计主题(可以clone或参考仓库)

配置文档

  • 关于 Prompt - PowerShell | Microsoft Learn

  • 文档中给出了基本信息和配置方式,这里不再赘述,而讨论许多配置效果以及可能遇到的问题

  • PowerShell 中的 prompt 函数是一个特殊内置函数,它负责定义命令行提示符的格式和内容。每当 PowerShell 完成一行命令的执行并准备接受下一条命令输入时,它会调用 prompt 函数来生成一个新的提示符字符串。

    默认情况下,prompt 函数显示类似以下格式的提示符:

    PS [当前目录]>
    

    这里的 “PS” 是 PowerShell 的标识符,紧跟的是当前工作目录路径,然后是一个大于号(>),表示等待用户输入命令。

    用户可以根据需要自定义 prompt 函数以改变提示符的行为和样式,例如添加时间戳、用户名、主机名、颜色等元素。例如,一个简单的自定义 prompt 函数可能如下所示:

    function prompt {"$([System.DateTime]::Now.ToString('yyyy-MM-dd HH:mm:ss')) $($executionContext.SessionState.Path.CurrentLocation)$('>' * ($nestedPromptLevel + 1)) "
    }
    

    上述函数会让 PowerShell 提示符显示当前时间以及目录,而不是默认的格式。

    通过编辑 prompt 函数,您可以完全个性化您的 PowerShell 控制台体验,使其更符合个人喜好或特定工作场景的需求。

Prompt命令来自哪里

如果机器上安装了许多软件,可能会遇到命令活别名冲突

例如我的机器上安装了MiniConda,并且配置了powershell启动Conda环境

然后发现了powershell内置的Prompt函数被覆盖了

  • PS>gcm promptCommandType     Name                                               Version    Source
    -----------     ----                                               -------    ------
    Function        prompt                                             0.0        Conda
    

简单修改

  • 使用posh等美化工具需要比较大的开销,反映会变慢;

  • 我们可以利用以下方法简单地修改默认地powershell提示符样式

    function prompt_style
    {Set-Item -Path function:prompt -Value { 'PS ' + '🕰️' + (Get-Date -Format T) + ' ' + "[$(Get-Location)]" + ' ' }# 显示时分秒,可以用-Format T 或 -Displayhint time
    }
    
  • PS 🕰️11:45:19 [C:\repos\scripts]
  • 日期或时间显示字段设置:Get-Date (Microsoft.PowerShell.Utility) - PowerShell | Microsoft Learn

带上电量和时间的Prompt

  • function Get-BatteryLevel
    {# get battery charge:$charge = Get-CimInstance -ClassName Win32_Battery | Select-Object -ExpandProperty EstimatedChargeRemainingreturn $charge# "Current Charge:[ $charge %]."# -replace '.*\[(.*)\].*', '$1'
    }function Set-PromptNice
    {Set-Item -Path function:prompt -Value { 'PS ' + '🕰️' + (Get-Date -Format T) + ' ' + "[$(Get-Location)]" + " 🔋$(Get-BatteryLevel)%" + '> ' }# 显示时分秒,可以用-Format T 或 -Displayhint time
    }
    
  • 效果

    #执行上述函数,调用之
    PS C:\Users\cxxu>Set-PromptNice
    #查看效果
    PS 🕰️21:22:26 [C:\Users\cxxu] 🔋77%> pwdPath
    ----
    C:\Users\cxxu
    

复杂修改

预览

  • 深色主题浅色主题
    在这里插入图片描述在这里插入图片描述

FAQ:没有必要修改

  • 有些用户觉得没必要,确实,通常没有必要去修改原生的shell样式

    • 让prompt显示的信息满足自己的需要才是最好的
    • 过少的内容可能让人觉得单调
    • 过多的内容会导致重点不突出,反而影响效率
    • 通常提示符的内容不要超过2行为宜
    • 追求简洁的可以结束阅读,后面的内容有简洁和信息均衡的prompt可供参考,而且仓库内提供了多个样式
      • 有很简单的,也有很复杂的
      • 后续可能会引入git 信息检查,但是根据经验,进入大型仓库后prompt的响应性能可能会受到较大影响,这时体验会急剧下降
  • 下面提到的Prompt样式虽然显示的项目不少,但是相应性能是不错的

    • 但是可能会比较依赖于$profile中自动初始化的部分代码,也即是说刚启动一个新的powershell环境时,可能会有比较明显的延迟,但是加载完环境后,prompt具有良好的相应速度
    • 具体实现被我放到多个模块中,以提高灵活性和可维护性

相关仓库地址

  • modules - 码云 - 开源中国 (gitee.com)
  • 相关模块(目录):
    • pwsh
    • Info
    • TaskSchdPwsh
    • …powershell Global变量
  • 仓库中有许多文档(后期更新整理)

样式选择

PS[BAT:77%][MEM:36.65% (11.62/31.70)GB][21:26:16]
# [C:\Windows]Set-PromptVersion Balance#目前可选的样式:
Balance     Brilliant   Brilliant2  Default     Short       short2      Simple

平衡样式

  • 效果预览

    PS[BAT:77%][MEM:36.64% (11.62/31.70)GB][21:24:13]
    # [~\Desktop]
    PS[BAT:77%][MEM:36.67% (11.63/31.70)GB][21:25:54]
    # [~]cd $env:windirPS[BAT:77%][MEM:36.65% (11.62/31.70)GB][21:26:16]
    # [C:\Windows]
    
  • 这个提示符带有多个信息

    • 电池电量
    • 内存占用比率
    • 已使用内存
    • 总量比例
    • 显示时分秒
  • 配色丰富清晰(上一节的截图中查看)

  • 具有较好的兼容性(没有花哨的字体和符号)

  • 具有较高的相应速度

花哨样式

  • ┌─PS[BAT:77%][MEM:39.84% (12.63/31.70)GB]
    ├─[cxxu@COLORFULCXXU][2024-04-19][21:44:35]
    ├─# [~\Desktop]
    └─ pwdPath
    ----
    C:\Windows
    
  • 在平衡样式的基础上进一步显示:userName@HostName以及年月日的信息

  • 并且用阶梯状的风格显示这个大Prompt😂

  • 即便响应性能和平衡样式差不多,但过于花哨,容易喧宾夺主,我自己平时用的也比较少

响应性能

  • 经过实验,这几种样式响应性能都不错

    • 其中最耗时的时读取内存占用的命令,大概要100ms左右
    • 虽然100ms对于人来说慢,也就0.1s,但是对于计算机这个时间算不上短
    • 要知道默认的prompt响应时间0.1ms级别的,不超过1ms
    • 而经过实验,如果响应时间不超过0.1s,体验还是可以的,但是如果按住回车键不断刷新shell prompt,那么0.1s的响应速度就不够看了,此时能够发现比较明显的响应滞后
    • 而我们如果能够优化到0.01s级别的,那么响应速度在体验上就有了飞跃,即便是按住回车不断刷新prompt,也可以做到几乎感觉不到响应延迟(尽管仍然比不上0.0001s的默认响应速度)
  • 如何优化

    • 命令行中显示内存占用还是蛮酷的,那么如何优化?
    • 我们可以考虑拉大刷新内存占用的间隔,比如说每隔5秒钟计算一次内存占用信息(其他时刻获取上一次计算的结果)
    • 这样经过实验,可以把响应速度从0.1s级别提高到0.01s级别
    • 甚至我们还可以创建一个后台进程来执行计算内存占用这一耗时任务,而prompt每次刷新只需要读取后台进程给出的结果就行
  • 附上性能测试结果

    • #默认样式微调,性能是0.0001s级别的
      PS [C:\repos\scripts]> test-PromptDelay
      0.00019081 secondsPS [C:\repos\scripts]> set-PromptVersion brilliant#花哨样式,性能是0.01s级别的
      ┌─PS[BAT:77%][MEM:39.77% (12.61/31.70)GB]
      ├─[cxxu@COLORFULCXXU][2024-04-19][22:12:33]
      ├─# [C:\repos\scripts]
      └─ test-PromptDelay
      0.013235219999999997 seconds#推荐的平衡样式性能为0.01s级别
      PS[BAT:77%][MEM:39.62% (12.56/31.70)GB][22:12:44]
      # [C:\repos\scripts]test-PromptDelay
      0.01090278 seconds
      
    • 补充:test-PromptDelay函数测试10次prompt刷新调用的平均耗时

      • 内存占用计算每各5秒钟重新计算一次,提高响应速度
      • 那么内存占用率显示的是5秒内的数值(延迟不超过5秒),理想情况下平均数据滞后时间为2.5s

小结

  • 让shell 的prompt显示的信息丰富一些,色彩搭配丰富一些,可以提高命令行环境的使用体验
  • 同时,要注意避免过于复杂的prompt,会导致响应速度变慢,命令行输入输出信息被埋没在Prompt中导致效率降低

http://www.mrgr.cn/p/47110371

相关文章

nginx高性能负载均衡集群

高性能负载均衡集群 一、集群是什么简单地说,集群就是指一组(若干个)相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各自服务的独立服务器。 这些服务器之间可以彼此通信,协同向用户提供应用程序,系统…

机器学习day1

一、人工智能三大概念 人工智能三大概念 人工智能(AI)、机器学习(ML)和深度学习(DL) 人工智能:人工智能是研究计算代理的合成和分析的领域。人工智能是使用计算机来模拟,而不是人类…

动态内存管理 柔性数组

文章目录 动态内存函数 malloc freecallocrealloc 重新开辟空间realloc 也可以第一个参数为NULL,则是直接开辟内存,类似于malloc用法 常见的动态内存错误对空指针进行解引用操作对开辟的内存越界访问对非动态开辟的内存使用free释放使用free释放动态开辟…

ABS10-ASEMI开关电源整流桥ABS10

ABS10-ASEMI开关电源整流桥ABS10编辑:ll ABS10-ASEMI开关电源整流桥ABS10 型号:ABS10 品牌:ASEMI 封装:ABS-4 正向电流(Id):1A 反向耐压(VRRM):1000V 正向浪涌电流:30A 正向电压(VF):1.10V 引脚数量:4 芯片个数:4 芯片尺寸:50MIL 功率(Pd):小功率设备 工作温…

揭露 FileSystem 引起的线上 JVM 内存溢出问题

本文主要介绍了由FileSystem类引起的一次线上内存泄漏导致内存溢出的问题分析解决全过程。作者:来自 vivo 互联网大数据团队-Ye Jidong本文主要介绍了由FileSystem类引起的一次线上内存泄漏导致内存溢出的问题分析解决全过程。内存泄漏定义(memory leak):一个不再被程序使用…

Docker镜像的创建 和 Dockerfile

一. Docker 镜像的创建 创建镜像有三种方法,分别为基于已有镜像创建、基于本地模板创建以及基于 Dockerfile 创建。 1 基于现有镜像创建 (1)首先启动一个镜像,在容器里做修改docker run -it --name web3 centos:7 /bin/bash …

nginx高级篇之location高级实战

nginx location高级实战location是nginx的核心重要功能,可以设置网站的访问路径,一个web server会有多个路径,那么location就得设置多个。 Nginx的locaiton作用是根据用户请求的URI不同,来执行不同的应用。 针对用户请求的网站URL进行匹配,匹配成功后进行对应的操作。1.语…

【树莓派】yolov5 Lite,目标检测,行人检测入侵报警

延续之前的程序: https://qq742971636.blog.csdn.net/article/details/138172400 文章目录 播放声音pygame不出声音怎么办(调节音量)树莓派上的音乐播放器(可选)命令行直接放歌(尝试放mp3歌曲) …

一般神经网络的微分与网络参数的初始化

(文章的主要内容来自电科的顾亦奇老师的 Mathematical Foundation of Deep Learning, 有部分个人理解) 一般深度神经网络的微分 上周讨论的前向和反向传播算法可以推广到任意深度神经网络的微分。 对于一般的网络来说,可能无法逐层分割,但仍然可以用流…

第十五届蓝桥杯省赛第二场C/C++B组D题【前缀总分】题解(AC)

暴力解法 O ( 26 n 5 ) O(26n^5) O(26n5) 枚举将第 i i i 个字符串的第 j j j 个字符改为 c c c 的所有方案,时间复杂度 O ( 26 n 2 ) O(26n^2) O(26n2),修改并计算总分, O ( n 3 ) O(n^3) O(n3)。 暴力优化 O ( 26 n 3 log ⁡ n ) O…

openGauss 函数

函数 openGauss常用的函数如下: 数学函数abs(x) 描述:绝对值。 返回值类型:和输入相同。 示例: openGauss=# SELECT abs(-17.4);abs ------17.4 (1 row)cbrt(dp) 描述:立方根。 返回值类型:double precision 示例: openGauss=# SELECT cbrt(27.0);cbrt ------3 (1 row)c…

宿舍Giwifi聚合方案

方案A: 方案B: 方案C:

在 Linux 上把 Vim 配置为默认编辑器

目录 ⛳️推荐 在 Linux 命令行中编辑 将 Vim 设置为其他程序的默认值 在 Alpine 中编辑电子邮件 总结 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站 我使用 Linux 大概有…

SpringBoot整合AOP实现打印方法执行时间切面

pom.xml<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>代码 创建注解 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; imp…

MySQL中什么情况下会出现索引失效?如何排查索引失效?

目录 1-引言&#xff1a;什么是MySQL的索引失效&#xff1f;(What、Why)1-1 索引失效定义1-2 为什么排查索引失效 2- 索引失效的原因及排查&#xff08;How&#xff09;2-1 索引失效的情况① 索引列参与计算② 对索引列进行函数操作③ 查询中使用了 OR 两边有范围查询 > 或 …

rust中结构体的属性默认是不能修改的,要想修改可以有两种方式

Rust中结构体里面的属性默认是不支持修改的&#xff0c;而且默认不是pub的&#xff0c;要想修改的话&#xff0c;有两种方式&#xff0c;我以为和python里面的类似呢&#xff0c;但是还是需要一点技术含量的。如果想在引到外部修改&#xff0c;需要声明pub&#xff0c;如果想在…

Ubuntu 24.04 LTS x86_64 OVF (sysin) - VMware 虚拟机模板

Ubuntu 24.04 LTS x86_64 OVF (sysin) - VMware 虚拟机模板Ubuntu 24.04 LTS x86_64 OVF (sysin) - VMware 虚拟机模板 Ubuntu 24.04 LTS (GNU/Linux 6.8-generic x86_64) 请访问原文链接:Ubuntu 24.04 LTS x86_64 OVF (sysin) - VMware 虚拟机模板,查看最新版。原创作品,转…

路由选择协议三剑客--BGP协议

一、背景 边界网关协议(Border Gateway Protocol, BGP)是用来处理像因特网规模大小的网络协议,能够妥善处理好不相关路由域间的多路连接协议。BGP一般用于企业和企业之间,也就是运营商骨干网的通信,一般使用在AS内或AS间通信,在大型企业网中实现的比较多。 内部网关协议只…

Multitouch 1.27.28 免激活版 mac电脑多点触控手势增强工具

Multitouch 应用程序可让您将自定义操作绑定到特定的魔术触控板或鼠标手势。例如&#xff0c;三指单击可以执行粘贴。通过执行键盘快捷键、控制浏览器的选项卡、单击鼠标中键等来改进您的工作流程。 Multitouch 1.27.28 免激活版下载 强大的手势引擎 精心打造的触控板和 Magic …

【分布式通信】NPKit,NCCL的Profiling工具

NPKit介绍 NPKit (Networking Profiling Kit) is a profiling framework designed for popular collective communication libraries (CCLs), including Microsoft MSCCL, NVIDIA NCCL and AMD RCCL. It enables users to insert customized profiling events into different C…