如何在PowerShell与CMD中从自定义文件随机选Oh My Posh主题?
解决方案
一、PowerShell Profile 修改方案
直接替换你当前Profile里的Oh My Posh初始化行,改成以下代码,就能实现每次启动PowerShell时从自定义主题列表随机选一个:
# 读取自定义主题列表,过滤空行避免无效项 $themes = Get-Content -Path "~/Documents/my themes.txt" | Where-Object { $_ -match '\S' } # 随机挑选一个主题 $randomTheme = $themes | Get-Random # 初始化Oh My Posh oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH\$randomTheme" | Invoke-Expression Import-Module -Name Terminal-Icons
补充说明
- 加
Where-Object { $_ -match '\S' }是为了处理文件里可能存在的空行,防止选中无效主题 - 每次启动PowerShell都会重新随机选主题,要是想固定一段时间换一次,可以把选中的主题路径写到临时文件,下次启动先读临时文件,没有再随机,但默认需求用上面的代码就足够
二、Power Automate 实现的可行性
能实现,但完全没必要。Power Automate的思路是建定时流,每次运行时读取主题列表随机选一个,再修改你的PowerShell Profile里的主题路径。但这种方法需要额外配置流,还不如直接在Profile里动态随机高效,属于舍近求远,不推荐。
三、CMD 中实现相同功能
CMD本身没有便捷的随机读取文件行的命令,得结合PowerShell来实现,步骤如下:
打开CMD的启动脚本文件(没有就新建):
- 按
Win+R输入cmd /k echo %USERPROFILE%\cmd_autoexec.bat找到路径,创建或编辑这个文件
- 按
在
cmd_autoexec.bat里写入以下内容:
@echo off :: 调用PowerShell读取主题列表并随机选一个,存入临时变量 for /f "delims=" %%i in ('powershell -Command "$themes = Get-Content -Path '~/Documents/my themes.txt' | Where-Object { $_ -match '\S' }; $randomTheme = $themes | Get-Random; Write-Output $randomTheme"') do set "RANDOM_THEME=%%i" :: 初始化Oh My Posh(注意CMD的语法和PowerShell不同) oh-my-posh init cmd --config "%POSH_THEMES_PATH%\%RANDOM_THEME%" | cmd /v:on /c "set "PROMPT=$(&{exit $LASTEXITCODE})%PROMPT%""
补充说明
- 用
for /f捕获PowerShell输出的随机主题名称 - CMD的Oh My Posh初始化语法和PowerShell有差异,注意最后管道的写法
- 同样会过滤空行,避免选中无效主题
内容的提问来源于stack exchange,提问作者Jawad Mansoor
相关产品推荐
相关产品推荐

