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>$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.mfbz.cn/a/558334.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

国家级项目管理高级认证:CSPM-4级(高级)重磅推出

本周,圣略CSPM资深讲师老杨,赴北京参加CSPM-4级高级讲师培训,从现场带来第1手的资料,与大家分享: CSPM-4基本要求: 负责实现组织战略目标,以成果和收益为导向,需具备战略解析、收益…

汇编语言学习笔记

1、NOP指令:号称最安全的指令,全名为no Operation,一条nop指令占用一个字节,什么也不做。有时编译器会使用该指令将代码对齐到偶数地址边界(类似于内存对齐)。IA-32处理器从偶数双字地址处加载代码和数据时…

【简单介绍下Beego框架】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

等保合规:保护企业网络安全的必要性与优势

前言 无论是多部网络安全法律法规的出台,还是最近的“滴滴被安全审查”事件,我们听得最多的一个词,就是“等保。” 只要你接触安全类工作,听得最多的一个词,一定是“等保。” 那么,到底什么是“等保”呢…

c++初阶——类和对象(上)

大家好我是小锋今天我们来学习类和对象 面向过程和面向对象初步认识 C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。 C是基于面向对象的,关注的是对象,将一件事情拆分成不同的对…

NASM中的-f选项

2024年4月19日,周五下午 -f选项 在 NASM 中,-f 选项用于指定输出格式或目标文件格式。这个选项允许你告诉 NASM 将汇编代码编译成特定格式的目标文件,以便与特定的操作系统或环境兼容。下面是 -f 选项的一些常见用法和参数: -f …

✌粤嵌—2024/4/11—合并区间✌

代码实现: /*** Return an array of arrays of size *returnSize.* The sizes of the arrays are returned as *returnColumnSizes array.* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().*/// 交换 void swap(i…

“开关是灯的日出日落,日出日落是灯的开关”

C语言刷题 day01 本篇是C语言刷题大杂烩,收集了笔者遇到的认为有价值的题目,本篇会持续更新~~ day01 至少是其他数字两倍的最大数 题目原文: 题意解析: 请你找出数组中的最大元素并检查它是否 至少是数组中每个其他数字的两倍 …

【汇智知了堂来袭】西华师范大学鸿蒙专题讲座,共探HarmonyOS新机遇!

在这个信息化的时代,我们身处一个日新月异、科技飞速发展的世界。随着信创国产化的步伐加快,万物互联的大时代已经悄然开启。作为科技前沿的探索者,汇智知了堂始终站在行业的前沿,紧跟时代的发展脉搏。我们在4月9日走进西华师范大…

5. Django 探究CBV视图

5. 探究CBV视图 Web开发是一项无聊而且单调的工作, 特别是在视图功能编写方面更为显著. 为了减少这种痛苦, Django植入了视图类这一功能, 该功能封装了视图开发常用的代码, 无须编写大量代码即可快速完成数据视图的开发, 这种以类的形式实现响应与请求处理称为CBV(Class Base…

第一届AI Agent智能体现场开发大赛报名开启!8月上旬火热开赛~

由联想拯救者、AIGC开放社区、英特尔携手主办的“AI生成未来第二届拯救者杯OPENAIGC开发者大赛”已经正式启动,“2024 AI Agent极限挑战赛”作为特设专项赛道,也将同步于8月上旬开赛,参赛者将在更加紧张刺激的现场比赛中展现其技术与创造力。…

TypeScript 基础:接口、泛型和自定义类型在 Vue 3 中的应用

接口(Interfaces) 首先,我们定义一个接口 PersonInter 来描述一个人的信息,包括 id、name 和 age。 interface PersonInter {id: string;name: string;age: number; }自定义类型(Custom Types) 然后&…

如何在Windows 10中启用和使用上帝模式,这里有详细步骤

序言 上帝模式(God Mode)是一个特殊的文件夹,只在一个窗口中显示所有可用的操作设置。它可以节省搜索命令的时间,而无需知道通过“开始”菜单或“控制面板”查找命令的步骤。上帝模式默认情况下是隐藏的,所以我们需要…

世界500强:破解“智慧核能”数智化成功转型密码

近日,实在智能携手中国核能行业协会信息化专业委员会在中国人工智能小镇成功举办“基于大模型的RPA数字员工在核能行业实战应用案例专项培训”,中国核工业集团、中国广核集团、国家电力投资集团等企事业单位共同参加。中核集团作为我国核科技工业的主体&…

C++修炼之路之继承<二>

目录 一:子类的六大默认成员函数 二:继承与友元 三:继承与静态成员 四:复杂的继承关系菱形继承菱形虚拟继承 1.单继承 2.多继承 3.菱形继承;一种特殊的多继承 4.菱形虚拟继承 5.虚拟继承解决数据冗余和二…

javaagent使用

Java Agent是什么? Java Agent是Java平台提供的一个强大工具,它可以在运行时修改或增强Java应用程序的行为。是在JDK1.5以后引入的,它能够在不影响正常编译的情况下修改字节码,相当于是在main方法执行之前的拦截器,也叫…

启明云端ESP32-S3+车载桥接器案例,能实现对车载产品集控

最近房车旅行很盛行,谁不想五一自驾游开车去外面玩?为了能提升用户体验,车企房车智能化升级越来越普遍,接下来小启给大家讲一个案例,启明云端ESP32-S3车载桥接器,感兴趣的可以看看。 一、ESP32-S3车载桥接器…

实验:使用FTP+yum实现自制yum仓库

实验准备 FTP服务器端:centos-1(IP:10.9.25.33) 客户端:centos-2 两台机器保证网络畅通,原yum仓库可用,已关闭防火墙和selinux FTP服务器端 ①安装vsftpd并运行,设定开机自启动 安装vsftpd…

免费ssl通配符证书申请教程

在互联网安全日益受到重视的今天,启用HTTPS已经成为网站运营的基本要求。它不仅保障用户数据传输的安全,提升搜索引擎排名,还能增强用户对网站的信任。通配符证书是一种SSL/TLS证书,用于同时保护一个域名及其所有下一级子域名的安…

​面试经典150题——对称二叉树

1. 题目描述 2. 题目分析与解析 2.1 思路一——递归 为了解决问题“检查一个二叉树是否是对称的”,我们需要判断树的左子树和右子树是否是彼此的镜像。这意味着树的左子树的左侧应该与右子树的右侧相同,左子树的右侧应该与右子树的左侧相同。 定义问题…