配置文件提示代码的行为不一致

时间:2014-03-13 14:35:18

标签: powershell profile

我在两台独立的计算机上使用以下代码。在两台计算机上,它位于$ PROFILE.AllUsersAllHosts位置。

#http://powershell.com/cs/blogs/tips/archive/2010/11/22/test-admin-privileges.aspx
function Test-Admin {
    $identity = [Security.Principal.WindowsIdentity]::GetCurrent()
    $principal = new-object Security.Principal.WindowsPrincipal $identity
    $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
}

# Set this global variable so we don't have to check our role on every prompt
$global:AdminPrompt = (Test-Admin)

function prompt {
    # Set theme
    $cdelim = [ConsoleColor]::DarkCyan
    $chost = [ConsoleColor]::Yellow
    $cloc = [ConsoleColor]::Cyan

    if($global:AdminPrompt){
        $chost = [ConsoleColor]::Red
    }

    #Set the Window Title
    (Get-Host).UI.RawUI.WindowTitle = pwd

    #Write the prompt
    write-host "$([char]0x0A7) " -n -f $cloc
    #alt method - write-host ([net.dns]::GetHostName()) -n -f $chost
    write-host $env:COMPUTERNAME -n -f $chost
    write-host ' {' -n -f $cdelim
    write-host (shorten-path (pwd).Path) -n -f $cloc
    write-host '}' -n -f $cdelim
    return ' '
}

function shorten-path([string] $path) {
    if(-NOT $global:AdminPrompt){
        $loc = $path.Replace($HOME, '~')
    } else {
        $loc = $path
    }
    # remove prefix for UNC paths
    $loc = $loc -replace '^[^:]+::', ''
    # make path shorter like tabs in Vim,
    # handle paths starting with \\ and . correctly
    return ($loc -replace '\\(\.?)([^\\])[^\\]*(?=\\)','\$1$2')
} 

在一台计算机上,当我使用RunAs调用新的Powershell时,它会在缩短路径中命中AdminPrompt测试并死掉。它给我留下了PS:>在命令提示符的末尾。但是,如果我点源配置文件,它会正确缩短提示的路径。

示例:

§ COMPUTERNAME {PS:>
§ COMPUTERNAME {PS:> . $PROFILE.AllUsersAllHosts
§ COMPUTERNAME {C:\W\System32}

在另一台计算机上,当我从头开始输入带有RunAs的Powershell时,我得到了预期的行为。由于我无法复制问题,因此很难解决问题!

1 个答案:

答案 0 :(得分:1)

检查$ error - 您可能会发现有关错误的提示。您也可以交互式呼叫提示,当您这样做时,错误应显示在屏幕上。

您可以通过设置断点来调试提示:

Set-BreakPoint -Command Prompt

然后你可以一步一步看看出了什么问题。