欢迎来到徐庆高(Tea)的个人博客网站
磨难很爱我,一度将我连根拔起。从惊慌失措到心力交瘁,我孤身一人,但并不孤独无依。依赖那些依赖我的人,信任那些信任我的人,帮助那些给予我帮助的人。如果我愿意,可以分裂成无数面镜子,让他们看见我,就像看见自己。察言观色和模仿学习是我的领域。像每个深受创伤的人那样,最终,我学会了随遇而安。
当前位置: 日志文章 > 详细内容

IDEA 通过脚本配置终端提示符样式的方法

2025年08月19日 Java
某天闲得无聊想要通过 powershell 的脚本修改 powershell 的提示符,让 idea 的终端显示更加鲜艳简洁,最终做到如下效果修改提示符颜色修改提示符提示普通用户和管理员权限修改路径表

某天闲得无聊想要通过 powershell 的脚本修改 powershell 的提示符,让 idea 的终端显示更加鲜艳简洁,最终做到如下效果

  • 修改提示符颜色
  • 修改提示符提示普通用户和管理员权限
  • 修改路径表现形式
  • 修改项目根路径以 ~ 表示

这是以管理员形式启动的idea,这时候终端是有管理员权限的,所以样式被改变了

实现流程

  1. 创建一个 ztp_function_idea.ps1 文件(该文件需要在配置在环境变量,如果没有则需要使用的时候键入完整路径)
function prompt {
    $dir = (get-location).path;
    if ($null -eq $env:work) {
        $env:work = $dir
    }
    $name = $env:username.tolower()
    # 定义路径映射:每个元素是路径表达式和对应简称的元组
    $pathaliases = @(
        @{ path = $env:userprofile; alias = 'home' }
        @{ path = $env:work; alias = '~' }
        @{ path = [environment]::getfolderpath('desktop'); alias = 'desktop' }
        @{ path = [environment]::getfolderpath('mydocuments'); alias = 'documents' }
        @{ 
            # personal 文件夹且不等于 mydocuments(避免重复)
            path = { [environment]::getfolderpath('personal') }; 
            condition = { $dir -eq $_.invoke() -and $dir -ne [environment]::getfolderpath('mydocuments') }
            alias = 'documents' 
        }
        @{ path = [environment]::getfolderpath('startup'); alias = 'startup' }
        @{ path = [environment]::getfolderpath('startmenu'); alias = 'startmenu' }
        @{ path = [environment]::getfolderpath('commonstartup'); alias = 'startup' }
        @{ path = [environment]::getfolderpath('commonstartmenu'); alias = 'startmenu' }
        @{ path = [environment]::getfolderpath('favorites'); alias = 'favorites' }
        @{ path = [environment]::getfolderpath([environment+specialfolder]::applicationdata); alias = 'roaming' }
        @{ path = [environment]::getfolderpath('localapplicationdata'); alias = 'localappdata' }
        @{ path = ${env:programfiles(x86)}; alias = 'programfiles(x86)' }
        @{ path = [environment]::getfolderpath('templates'); alias = 'templates' }
        @{ path = [environment]::getfolderpath('recent'); alias = 'recent' }
        @{ path = [environment]::getfolderpath('sendto'); alias = 'sendto' }
        @{ path = [environment]::getfolderpath([environment+specialfolder]::networkshortcuts); alias = 'nethood' }
        @{ path = [environment]::getfolderpath([environment+specialfolder]::printershortcuts); alias = 'printhood' }
        @{ path = [environment]::getfolderpath([environment+specialfolder]::mymusic); alias = 'music' }
        @{ path = [environment]::getfolderpath([environment+specialfolder]::mypictures); alias = 'pictures' }
        @{ path = [environment]::getfolderpath([environment+specialfolder]::myvideos); alias = 'videos' }
        @{ 
            path = { (new-object -comobject shell.application).namespace('shell:downloads').self.path }
            alias = 'downloads'
        }
        @{ path = "$env:userprofile\onedrive"; alias = 'onedrive' }
        @{ path = "$env:programfiles\windowsapps"; alias = 'windowsapps' }
        @{ path = [environment]::getfolderpath('system'); alias = 'system' }
        @{ path = [environment]::getfolderpath('commonapplicationdata'); alias = 'programdata' }
        @{ path = [environment]::getfolderpath('programfiles'); alias = 'programfiles' }
        @{ path = $env:windir; alias = 'windows' }
    )
    $flag = 0
    # 遍历数组查找匹配项
    foreach ($item in $pathaliases) {
        $targetpath = if ($item.path -is [scriptblock]) { $item.path.invoke() } else { $item.path }
        if ($dir.startswith($targetpath, [system.stringcomparison]::ordinalignorecase)) {
            if ($item.condition) {
                if($item.condition.invoke()){}
            }
            $relative = $( $suffix = $dir.substring($targetpath.length).trimstart('\'); "/$suffix".trimend('/') )
            $dir = $item.alias + $relative
            $result = if ($item.alias -eq '~') { '' } else { '/' }
            $dir = $result + $dir.replace('\', '/').replace(':', '/') -replace '/+', '/'
            $flag = 1
            break
        }
    }
    $dir = $dir.tolower()
    if ($flag -eq 0) {
        # $dir = '/' + $dir.tolower().replace('\', '/').replace(':', '/') -replace '/+', '/'
        $dir = '/' + $dir.replace('\', '/').replace(':', '/') -replace '/+', '/'
        $dir = $dir -replace '/$',''
    }
    # ✅ ansi 控制字符
    $esc = [char]27
    $green_bold = "$esc[1;32m"   # 加粗 + 绿色
    $blue       = "$esc[34m"     # 蓝色
    $reset      = "$esc[0m"      # 重置(关闭所有样式)
    $isadmin = ([security.principal.windowsprincipal] [security.principal.windowsidentity]::getcurrent()).isinrole([security.principal.windowsbuiltinrole]::administrator)
    $userpart     = "root@$name"
    $pathpart     = $dir
    $promptchar   = "# "
    if (!$isadmin) {
        $userpart     = "$name@$name"
        $promptchar   = "$ "
    }
    # 组合输出:绿色加粗用户名 + 重置后加冒号 + 蓝色路径 + 重置 + 提示符
    "$green_bold$userpart$reset`:$blue$pathpart$reset$promptchar"
    # "root@$name`:$dir# " 
}
# todo 启动一个终端并应用上面的函数 %systemroot%\system32\windowspowershell\v1.0\powershell.exe -noexit chcp 65001
  1. 修改 idea 终端的路径
c:\windows\system32\windowspowershell\v1.0\powershell.exe  -noexit -command "chcp 65001; . 'ztp_function_idea'"

到此这篇关于idea 通过脚本配置终端提示符样式的方法的文章就介绍到这了,更多相关idea终端提示符内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!