我在两台独立的计算机上使用以下代码。在两台计算机上,它位于$ 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时,我得到了预期的行为。由于我无法复制问题,因此很难解决问题!
答案 0 :(得分:1)
检查$ error - 您可能会发现有关错误的提示。您也可以交互式呼叫提示,当您这样做时,错误应显示在屏幕上。
您可以通过设置断点来调试提示:
Set-BreakPoint -Command Prompt
然后你可以一步一步看看出了什么问题。