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

news2024/9/24 5:32:17

文章目录

    • 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>$null
    if ($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 prompt
    
    CommandType     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 EstimatedChargeRemaining
        return $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%> pwd
    
    Path
    ----
    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:windir
    
    PS[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]
    └─ pwd
    
    Path
    ----
    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 seconds
      
      PS [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.coloradmin.cn/o/1616208.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【git】git ignore如何添加core/config.py忽略

在Git中,.gitignore文件用于指定不被Git追踪的文件和文件夹。要添加core/config.py文件到.gitignore中,你需要编辑.gitignore文件并添加以下行: core/config.py这行表示Git应该忽略名为config.py的文件,它位于core目录下。确保在…

Codeforces Round 821 (Div. 2) D2. Zero-One

题目 #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e5 5, inf 1e18, maxm 4e4 5; const int N 1e6;c…

vue项目前端axios跨域请求处理问题

在我的服务器里面新建了一个txt文档&#xff0c;但在vue项目里面对这个文档发起请求的时候因为是ip地址请求&#xff0c;跨域请求失败&#xff0c;在配置了vue.config.js的请求代理后得以解决 报错示例&#xff1a; 解决方法&#xff1a; 1、在vue.config.js中配置跨越请求代…

microk8s拉取pause镜像卡住

前几天嫌服务器上镜像太多占空间&#xff0c;全部删掉了&#xff0c;今天看到 microk8s 更新了 1.30 版本&#xff0c;果断更新&#xff0c;结果集群跑不起来了。 先通过 microk8s.kubectl get pods --all-namespaces 命令看看 pod 状态。 如上图可以看到&#xff0c;所有的业…

【触摸案例-触摸事件介绍 Objective-C语言】

一、触摸事件 1.接下来,我们来说这个,触摸事件, iOS当中的事件,可以分为三大类: 1)触摸事件 2)加速计事件 3)远程控制事件 事件呢,这个里面呢,使用app的过程当中呢,产生各种各样的事件,事件呢,分为三大类,在iOS里边儿啊,分为三大类,首先,有一个叫做触摸事…

NLP大模型的训练

NLP模型的训练主要分成两步&#xff1a; 1.先进行通用任务的训练&#xff1b;无监督的样本是无穷无尽的&#xff1b; 这里列举两种&#xff1a;MLM和NSP,NSP由于在某些论文中被证明是无效的&#xff0c;所以用的少&#xff1b; MLM: 接下来会在特定任务上进行finetune>su…

Nacos分布式配置中心

<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 https://…

社交巨头与去中心化:解析Facebook在区块链的角色

在数字化时代&#xff0c;社交媒体已经成为人们日常生活中不可或缺的一部分。作为全球最大的社交媒体平台&#xff0c;Facebook 在社交领域的影响力无可置疑。然而&#xff0c;随着区块链技术的崛起&#xff0c;Facebook 也开始探索如何将这一技术应用于其平台&#xff0c;以适…

【无监督+自然语言】GPT,GPT-2,GPT-3 方法概述 (Generative Pre-Traning)

主要参考 【GPT&#xff0c;GPT-2&#xff0c;GPT-3 论文精读【李沐论文精读】-2022.03.04】 https://www.bilibili.com/video/BV1AF411b7xQ/ 大语言模型综述&#xff1a; http://t.csdnimg.cn/4obR4 发展节点 2017.06 Transformer: 所有大语言模型LLMs的基础结构 , Attent…

windows服务器iis系统部署https

源地址&#xff1a;https://www.ctvol.com/seoomethods/1418785.html https是网页常用的一种网络安全机制&#xff0c;在部署其他服务器https&#xff0c;我们在前面文章中已经提到过。下面我们来说说windows服务器iis系统部署https步骤&#xff1a; 1、到服务提供商下载所需…

WPF2022终结版系列课程笔记 1 WPF 基本布局

本笔记为B站 微软系列技术教程 WPF项目实战合集(2022终结版) 项目记录 WPF 基本布局 WPF布局原则 一个窗口中只能包含一个元素 不应显示设置元素尺寸 不应使用坐标设置元素的位置 可以嵌套布局容器 WPF布局容器 StackPanel: 水平或垂直排列元素、Orientation属性分别: Hor…

森林消防装备:高压消防接力水泵/恒峰智慧科技

在广袤无垠的森林中&#xff0c;每一份绿色都是大自然赋予我们的宝贵财富。然而&#xff0c;这些美丽的绿色也可能因为一场突如其来的火灾而被瞬间吞噬。为了保护这片生命的绿洲&#xff0c;我们需要一种高效、可靠的消防装备——高压消防接力水泵。 这款森林消防装备采用本田汽…

Hadoop3:HDFS、YARN、MapReduce三部分的架构概述及三者间关系(Hadoop入门必须记住的内容)

一、HDFS架构概述 Hadoop Distributed File System&#xff0c;简称HDFS&#xff0c;是一个分布式文件系统。 1&#xff09;NameNode(nn)&#xff1a;存储文件的元数据&#xff0c;如文件名&#xff0c;文件目录结构&#xff0c;文件属性&#xff08;生成时间、副本数、文件…

Linux 系统IO函数之stat、lstat函数

1、stat函数 要点&#xff1a; int stat(const char *pathname, struct stat *statbuf); 作用&#xff1a;查看文件的信息 man 2 stat/return value1、stat结构体&#xff1a; 2、sturct stat 结构体中 st_mode 的含义&#xff08;文件的类型和存取的权限&#xff09;: st_mo…

go语言通过TCP协议实现聊天室样例

1、服务端&#xff1a; package mainimport ("fmt""net""sync" )type ChatServer struct {clients map[string]net.ConnclientsMux sync.Mutex }func NewChatServer() *ChatServer {return &ChatServer{clients: make(map[string]net.Co…

JS-47-Node.js06-fs模块-读写文件

Node.js内置的fs模块就是文件系统模块&#xff0c;负责读写文件。 和所有其它JavaScript模块不同的是&#xff0c;fs模块同时提供了异步和同步的方法。 一、回顾&#xff1a;异步方法VS同步方法 1-1、异步方法 因为JavaScript的单线程模型&#xff0c;执行IO操作时&#xff…

iStat Menus for Mac:强大的系统监控工具

iStat Menus for Mac是一款功能强大的系统监控工具&#xff0c;专为Mac用户设计&#xff0c;旨在帮助用户全面了解电脑的运行状态&#xff0c;提高电脑的性能和稳定性。 iStat Menus for Mac v6.73 (1239)中文版下载 该软件可以实时监测CPU使用率、内存占用、网络速度、硬盘活动…

华为P系列“砍了”,三角美学系列全新登场

2021 年 10 月&#xff0c;Intel 正式带来了颠覆以往的第 12 代酷睿「混合架构」 CPU。 不知道是良心发现还是为了弥补 11 代酷睿过于拉胯表现&#xff0c;Intel 终于把狠活儿都用在了这代。 全新 Intel 7 工艺、全新架构、单核与多核性能大幅提升&#xff0c;让大家十分默契…

excel文件可以直接转换成图片格式吗?excel文件怎样才能快速转换成图片?excel文件快速转换成图片的方法

一&#xff0c;excel文件转图片的必要性 1&#xff0c;excel文件转图片可以提高信息传播的便捷性。在日常工作中&#xff0c;我们可能需要将表格数据分享给同事或客户&#xff0c;但由于Excel文件的复杂性&#xff0c;对方可能需要安装相应的软件才能查看。而如果将Excel文件转…

【多态】底层原理

博主首页&#xff1a; 有趣的中国人 专栏首页&#xff1a; C进阶 本篇文章主要讲解 多态底层原理 的相关内容 1. 多态原理 1.1 虚函数表 先看一下这段代码&#xff0c;计算一下sizeof(Base)是多少&#xff1a; class Base { public:virtual void Func1(){cout << &quo…