2025-11-26 16:08:17 +08:00

8.9 KiB
Raw Blame History

title, date, tags
title date tags
PowerShell 2023-10-07 11:25:08

PowerShell 7 使用 Oh My Posh 来美化命令行

安装 PowerShell 7

PowerShell 7 指的不是系统自带的 powershell ,而是新下载的(微软官方出品),当然这个教程也适用于系统自带的 powershell

微软官方文档地址:https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.2 下载地址:https://github.com/PowerShell/PowerShell/releases 或者可通过 Winget 方式下载安装

winget search --id Microsoft.PowerShell

Output

Name               Id                           Version Source
---------------------------------------------------------------
PowerShell         Microsoft.PowerShell         7.5.4.0 winget
PowerShell Preview Microsoft.PowerShell.Preview 7.6.0.5 winget

使用 --id 参数安装 PowerShell 或 PowerShell 预览版

winget install --id Microsoft.PowerShell --source winget
winget install --id Microsoft.PowerShell.Preview --source winget

安装 Oh My Posh

官方文档地址:https://ohmyposh.dev/

最好在管理员模式下运行 powershell

下载安装,在 powershell 命令行中输入

winget install oh-my-posh

powershell 命令行中输入下面命令,打开 $Profile 进行设置,如果系统提示不存文件,是否创建,请点击创建

notepad $Profile

将以下命令添加到 $Profile 文件中

oh-my-posh init pwsh | Invoke-Expression

应用修改,则直接在命令行中执行 . $Profile ,如果出现错误等问题,请尝试关闭所有 powershell 命令窗口,重新打开,一般都会正常显示

配置环境变量

配置 POSH_THEMES_PATH 环境变量,最好配置成系统级别的,路径在 C:\Users\<当前登录用户>\AppData\Local\Programs\oh-my-posh\themes 下面。

更改主题

powerShell 命令行中输入 Get-ChildItem $env:POSH_THEMES_PATH 来获取所有的已安装主题

预览主题(官方推荐方式): 由于在终端里一次性渲染所有主题会很卡,官方建议直接去网页上看截图,然后记住名字即可。

编辑 $Profile 文件

notepad $Profile

oh-my-posh init pwsh ... 的部分後面加上 --config "$env:POSH_THEMES_PATH/{主題名稱}.omp.json"。 将其内部文字改为:

oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH/dracula.omp.json" | Invoke-Expression

文件

新建文件

New-Item <文件名>.<扩展名后缀>
New-Item my.ini

删除文件

Remove-Item <文件名>.<扩展名后缀>
Remove-Item my.ini

对文件添加内容

Set-Content <文件名>.<扩展名后缀> -value "<内容>"
Set-Content my.ini -value ""

新建文件夹

New-Item data -ItemType Directory

目录

做 sudo 命令

在Windows系统上sudo对应的就是管理员权限了。

一般使用Powershell时并不会管理员启动当执行需要权限的命令比如net start mysql就需要以管理员打开新的窗口。

为了一步到位这里给powershell创建一个alias -> sudo 来运行需要管理员权限的命令。

在文档目录中(在powershell执行$profile即可输出此文件路径),新建文件夹WindowsPowerShell,新建文件Microsoft.PowerShell_profile.ps1

此文件是在启动Powershell时执行的脚本。set-alias 在退出后就会失效,所以放到启动脚本中。

追加如下代码,然后重启Powershell窗口。

function _sudo {
    $ss = "$args ; pause"
    Start-Process powershell -Verb runAs -ArgumentList $ss
}
set-alias  -name sudo -value _sudo

保存后发现无法加载,因为默认不加载外部脚本,管理员权限下 powershell 运行:

set-ExecutionPolicy RemoteSigned

实用脚本

自动延长VS社区版过期时间

该脚本作用为 自动检查VS社区版是否在一天内过期如是则自动延长30天

需事先从Github上Clone开源项目beatcracker/VSCELicense: PowerShell module to get and set Visual Studio Community Edition license expiration date in registry (github.com)

然后放置在指定目录,并解除脚本执行限制,以管理员身份执行如下命令:

Set-ExecutionPolicy RemoteSigned

输入 A 即可

# 加载 VSCELicense 模块
try {
    Import-Module -Name 'C:\VSCELicense\VSCELicense.psd1' -ErrorAction Stop
} catch {
    Write-Error "无法加载模块 'C:\VSCELicense\VSCELicense.psd1',请确认路径是否正确。错误信息: $_"
    exit 1
}


# 获取许可证信息
try {
    $output = Get-VSCELicenseExpirationDate -ErrorAction Stop | Out-String
} catch {
    Write-Error "执行 Get-VSCELicenseExpirationDate 时出错: $_"
    exit 1
}

# 使用正则表达式提取版本号和过期日期
$version = $null
$expDateStr = $null

if ($output -match '(?m)^\s*(\d{4})\s+(\d{2}/\d{2}/\d{4}\s+\d{2}:\d{2}:\d{2})') {
    $version = $matches[1].Trim()
    $expDateStr = $matches[2].Trim()
    Write-Host "找到版本: $version"
    Write-Host "过期日期: $expDateStr"
} else {
    Write-Error "无法从输出中找到版本和过期日期"
    exit 1
}

# 将过期日期字符串解析为 DateTime 对象
try {
    $expirationDate = [datetime]::ParseExact($expDateStr, 'dd/MM/yyyy HH:mm:ss', $null)
} catch {
    Write-Error "日期格式解析失败: $expDateStr. 错误: $_"
    exit 1
}

# 获取当前时间并设置阈值
$currentTime = Get-Date
$threshold = $currentTime.AddDays(1)

Write-Host "当前时间: $currentTime"
Write-Host "过期时间: $expirationDate"
Write-Host "阈值时间(当前时间 + 1天: $threshold"

# 判断是否在1天内过期 -le 表示小于等于 想起了 Mybatis-Plus 条件构造器中的 le
if ($expirationDate -le $threshold) {
    Write-Host "许可证即将过期,正在执行 Set-VSCELicenseExpirationDate 命令..."
    try {
        Set-VSCELicenseExpirationDate -Version $version -ErrorAction Stop
        Write-Host "Set-VSCELicenseExpirationDate 命令执行成功。"
    } catch {
        Write-Error "执行 Set-VSCELicenseExpirationDate 时出错: $_"
        exit 1
    }
} else {
    Write-Host "许可证未在一天内过期,无需操作。"
}

输出如下:

image-20250718112238088

可结合任务计划程序进行使用,免去手动执行的烦恼

image-20250718142611106

🧩 步骤 1打开任务计划程序

  1. 按下 Win + R,输入 taskschd.msc,回车。
  2. 在左侧的“任务计划程序库”中,右键选择“创建任务”。

🧩 步骤 2设置任务基本信息

  • 常规

    选项卡:

    • 名称:例如 Check-VS-LicenseExpiration
    • 描述(可选):每天早上 7 点检查许可证过期状态
    • 勾选“不管用户是否登录都要运行”
    • 勾选“使用最高权限”

image-20250718142545538

🧩 步骤 3设置触发器

  1. 切换到 触发器 选项卡。
  2. 点击 新建
  3. 设置:
    • 开始时间:07:00:00
    • 每天
    • 勾选“启用此触发器”
  4. 点击 确定

image-20250718142556458

🧩 步骤 4设置操作

  1. 切换到 操作 选项卡。
  2. 点击 新建
  3. 设置:
    • 操作:启动程序
    • 程序/脚本:powershell.exe
    • 参数(可选):-ExecutionPolicy RemoteSigned -File "C:\VSCELicense\Check-VS-LicenseExpiration.ps1
    • 起始于(可选):C:\VSCELicense(确保路径正确)

说明

  • -ExecutionPolicy RemoteSigned:允许本地脚本运行,避免执行策略限制。
  • "C:\VSCELicense\Check-VS-LicenseExpiration.ps1":替换为你实际的脚本路径。
  • 如果脚本路径包含空格,请用双引号包裹。

🧩 步骤 5设置条件可选

  1. 切换到 条件 选项卡。
  2. 可以取消勾选“只有在计算机使用交流电源时才启动此任务”,确保任务在任何电源模式下都能运行。

🧩 步骤 6设置设置可选

  1. 切换到 设置 选项卡。
  2. 勾选“如果任务失败,按以下频率重新启动”并设置时间间隔(如每 1 分钟)。
  3. 勾选“如果任务运行时间超过以下时间,则停止任务”并设置合理时间(如 1 小时)。

🧩 步骤 7保存任务

  1. 点击 确定
  2. 如果弹出用户账户控制UAC提示输入管理员凭据确认。