--- title: PowerShell date: 2023-10-07 11:25:08 tags: --- # 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 方式下载安装 ```powershell winget search --id Microsoft.PowerShell ``` Output ```powershell 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 预览版 ```powershell winget install --id Microsoft.PowerShell --source winget ``` ```powershell winget install --id Microsoft.PowerShell.Preview --source winget ``` ## 安装 Oh My Posh 官方文档地址:https://ohmyposh.dev/ 最好在管理员模式下运行 `powershell` 下载安装,在 `powershell` 命令行中输入 ```powershell winget install oh-my-posh ``` 在 `powershell` 命令行中输入下面命令,打开 `$Profile` 进行设置,如果系统提示不存文件,是否创建,请点击创建 ```powershell notepad $Profile ``` 将以下命令添加到 `$Profile` 文件中 ```powershell 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` 来获取所有的已安装主题 **预览主题(官方推荐方式):** 由于在终端里一次性渲染所有主题会很卡,官方建议直接去网页上看截图,然后记住名字即可。 - **[Oh My Posh 官方主题预览页 (Themes)](https://ohmyposh.dev/docs/themes)** 编辑 `$Profile` 文件 ```powershell notepad $Profile ``` 把 `oh-my-posh init pwsh ...` 的部分後面加上 `--config "$env:POSH_THEMES_PATH/{主題名稱}.omp.json"`。 将其内部文字改为: ```powershell oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH/dracula.omp.json" | Invoke-Expression ``` # 文件 ## 新建文件 ```powershell New-Item <文件名>.<扩展名后缀> New-Item my.ini ``` ## 删除文件 ```powershell Remove-Item <文件名>.<扩展名后缀> Remove-Item my.ini ``` ## 对文件添加内容 ```powershell Set-Content <文件名>.<扩展名后缀> -value "<内容>" Set-Content my.ini -value "" ``` ## 新建文件夹 ```powershell 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窗口。** ```text function _sudo { $ss = "$args ; pause" Start-Process powershell -Verb runAs -ArgumentList $ss } set-alias -name sudo -value _sudo ``` 保存后发现无法加载,因为默认不加载外部脚本,管理员权限下 powershell 运行: ```text 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)](https://github.com/beatcracker/VSCELicense) > > 然后放置在指定目录,并解除脚本执行限制,以管理员身份执行如下命令: > > ```powershell > Set-ExecutionPolicy RemoteSigned > ``` > > 输入 A 即可 ```powershell # 加载 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](D:\source\repos\XiaodaBlogSource\source\_posts\PowerShell\image-20250718112238088.png) 可结合任务计划程序进行使用,免去手动执行的烦恼 ![image-20250718142611106](D:\source\repos\XiaodaBlogSource\source\_posts\PowerShell\image-20250718142611106.png) ### 🧩 步骤 1:打开任务计划程序 1. 按下 `Win + R`,输入 `taskschd.msc`,回车。 2. 在左侧的“任务计划程序库”中,右键选择“创建任务”。 ### 🧩 步骤 2:设置任务基本信息 - 常规 选项卡: - 名称:例如 `Check-VS-LicenseExpiration` - 描述(可选):每天早上 7 点检查许可证过期状态 - 勾选“不管用户是否登录都要运行” - 勾选“使用最高权限” ![image-20250718142545538](D:\source\repos\XiaodaBlogSource\source\_posts\PowerShell\image-20250718142545538.png) ### 🧩 步骤 3:设置触发器 1. 切换到 **触发器** 选项卡。 2. 点击 **新建** 。 3. 设置: - 开始时间:`07:00:00` - 每天 - 勾选“启用此触发器” 4. 点击 **确定** 。 ![image-20250718142556458](D:\source\repos\XiaodaBlogSource\source\_posts\PowerShell\image-20250718142556458.png) ### 🧩 步骤 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)提示,输入管理员凭据确认。