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

文章目录

    • 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.mzph.cn/bicheng/743.shtml

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

相关文章

CSDN积分和等级和 能创建专栏数量的关系。还差1000多分!

积分查询:CSDN 博客积分规则 博客积分是CSDN对用户努力的认可和奖励,也是衡量博客水平的重要标准。博客等级也将由博客积分唯一决定。积分规则具体如下: 1、每发布一篇原创或者翻译文章:可获得10分; 2、每发布一篇转载…

做一个答题pk小程序多少钱

在探讨“做一个答题pk小程序多少钱”这一问题时,我们首先需要明确的是,小程序的价格并非固定不变,而是受到多种因素的影响。这些因素包括但不限于小程序的复杂度、功能需求、开发周期、技术难度以及开发团队的规模和经验等。因此,…

Web前端 JavaScript笔记7

js的执行机制 js是单线程 同步:前面一个任务执行结束之后,执行后一个 异步:异步任务,引擎放在一边,不进入主线程,而进入任务队列的任务 js通过浏览器解析,浏览器靠引擎解析 回调函数同步任务执行…

LabVIEW卡尔曼滤波技术

LabVIEW卡尔曼滤波技术 在现代航空导航中,高精度和快速响应的方位解算对于航空安全至关重要。通过LabVIEW平台实现一种卡尔曼滤波方位解算修正技术,以改善传统导航设备在方位解算中的噪声干扰问题,从而提高其解算精度和效率。通过LabVIEW的强…

Java基础之JVM基础调优与常见问题

常见命令 以下命令的介绍,全部在jdk8环境下运行的; jps ☆☆☆☆☆ 查看当前运行的进程号; jmap ☆☆☆ jmap命令可以查看jvm的内存信息,class对应的实例个数以及占用的内存大小 jmap -histo 查看当前java进程 [rdVM-8-12-c…

Ugee手写板Ex08 S设置流程

手写笔的结构 笔尖 鼠标左键 上面第一个键:鼠标右键(效果有时候也不完全等同) 上面第二个键:鼠标中键 WPS ①打开pdf ②批注->随意画->画曲线 效果如下:

小程序中使用HTTPS调用自带文本安全内容检测接口(msg_sec_check)的实现方法

在小程序中调用自带的文本安全内容检测接口,你需要使用小程序提供的wx.request方法。以下是一个示例代码: javascript代码: // 假设你已经获取了access_token,如果不知道如何获取,可以参考我上一篇文章 const access_token 你的access_tok…

Python 基于docker部署的Mysql备份查询脚本

前言 此环境是基于docker部署的mysql,docker部署mysql可以参考如下链接: docker 部署服务案例-CSDN博客 颜色块文件 rootbogon:~ 2024-04-18 16:34:23# cat DefaultColor.py ######################################################################…

java音乐播放器系统设计与实现springboot-vue

后端技术 SpinrgBoot的主要优点有: 1、为所有spring开发提供了一个更快、更广泛的入门体验; 2、零配置; 3、集成了大量常用的第三方库的配置; Maven: 项目管理和构建自动化工具,用于java项目。 java: 广泛使用的编程语…

python使用tkinter和ttkbootstrap制作UI界面(二)

这次讲解UI界面常用的主键,延续上文的框架进行编写,原界面如下: Combobox组件应用(下拉框) """Combobox组件"""global comvalue_operatorcomvalue_operator tk.StringVar()value_ope…

【论文阅读】用于遥感弱监督语义分割的对比标记和标签激活

【论文阅读】用于遥感弱监督语义分割的对比标记和标签激活 文章目录 【论文阅读】用于遥感弱监督语义分割的对比标记和标签激活一、介绍二、联系工作三、方法3.1 对比token学习模块(CTLM)3.2 Class token对比学习3.3 标签前景激活模块 四、实验结果 Cont…

【云计算】云数据中心网络(七):负载均衡

《云网络》系列,共包含以下文章: 云网络是未来的网络基础设施云网络产品体系概述云数据中心网络(一):VPC云数据中心网络(二):弹性公网 IP云数据中心网络(三)…

在Ubuntu 22.04上安装配置VNC实现可视化

前面安装的部分可以看我这篇文章 在Ubuntu 18.04上安装配置VNC实现Spinach测试可视化_ubuntu18开vnc-CSDN博客 命令差不多一样: sudo apt update sudo apt install xfce4 xfce4-goodies sudo apt install tightvncserver这个时候就可以启动server了 启动server&…

C++:map和set的使用

一、关联式容器介绍 在学习map和set之前,我们接触到的容器有:vector、list、stack、queue、priority_queue、array,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。 关联式容器也是用…

李沐-16 PyTorch 神经网络基础【动手学深度学习v2】

注:1. 沐神对应章节视频出处 2.代码使用Jupyter Notebook运行更方便 3.文章笔记出处 一、层和块 层:层(1)接受一组输入, (2)生成相应的输出, (3)由一组可调整…

【Camera Framework笔记】二、Camera Native Framework架构①

一、总体架构: service -> opencamera -> client(api1/api2) -> device3(hal3) | | (不opencamera…

Linux网络编程--网络传输

Linux网络编程--网络传输 Linux网络编程TCP/IP网络模型网络通信的过程局域网通信跨网络通信:问题总结: Linux网络编程 TCP/IP网络模型 发送方(包装): 应用层:HTTP HTTPS SSH等 —> 包含数据&#xff0…

终极版商城平台 涵盖虚拟商品全功能的商城平台 全能商城小程序 智慧商城系统 全品类百货商城服务

终极版商城平台 涵盖虚拟商品全功能的商城平台 全能商城小程序 智慧商城系统 全品类百货商城服务 含uniapp源码 全功能商城系统:完美运营版,简洁无冗余 这款商城系统完美集成了拼团、团购、秒杀、积分兑换、砍价活动,同时支持实物商品与虚拟…

2010年认证杯SPSSPRO杯数学建模B题(第一阶段)交通拥堵问题全过程文档及程序

2010年认证杯SPSSPRO杯数学建模 交通拥堵问题 B题 Braess 悖论 原题再现: Dietrich Braess 在 1968 年的一篇文章中提出了道路交通体系当中的Braess 悖论。它的含义是:有时在一个交通网络上增加一条路段,或者提高某个路段的局部通行能力&a…

深度学习知识点:循环神经网络(RNN)、长短期记忆网络(LSTM)、门控循环单元(GRU)

深度学习知识点:循环神经网络(RNN)、长短期记忆网络(LSTM)、门控循环单元(GRU) 前言循环神经网络(RNN)RNNs(循环神经网络)训练和传统ANN&#xff…