本文目录
Powershell已经提供了许多用户能够使用的预定义函数,这些函数可以通过Function:PSDrive虚拟驱动器查看。
PS E:mossfly.com> dir function: | ft -AutoSize
CommandType Name Definition
----------- ---- ----------
Function A: Set-Location A:
Function B: Set-Location B:
Function C: Set-Location C:
Function cd.. Set-Location ..
Function cd Set-Location
Function Clear-Host $space = New-Object System.Management.Automa...
Function D: Set-Location D:
Function Disable-PSRemoting ...
Function E: Set-Location E:
Function F: Set-Location F:
Function G: Set-Location G:
Function Get-Verb ...
Function H: Set-Location H:
Function help ...
Function I: Set-Location I:
Function ImportSystemModules ...
Function J: Set-Location J:
Function K: Set-Location K:
Function L: Set-Location L:
Function M: Set-Location M:
Function mkdir ...
Function more param([string[]]$paths)...
Function N: Set-Location N:
Function O: Set-Location O:
Function P: Set-Location P:
Function prompt $(if (test-path variable:/PSDebugContext) { ...
Function Q: Set-Location Q:
Function R: Set-Location R:
Function S: Set-Location S:
Function T: Set-Location T:
Function TabExpansion ...
Function U: Set-Location U:
Function V: Set-Location V:
Function W: Set-Location W:
Function X: Set-Location X:
Function Y: Set-Location Y:
Function Z: Set-Location Z:
从这些结果不但能够看出函数的名称,还能通过Definition列查看函数的内容。如果你想深入查看函数的内部定义可以直接访问Function:
PS E:mossfly.com> $function:prompt
$(if (test-path variable:/PSDebugContext) { '[DBG]: ' } else { '' }) + 'PS ' +
$(Get-Location) + $(if ($nestedpromptlevel -ge 1) { '>>' }) + '> '
Powershell中的这些预定义的函数可以做很多重要的工作。
Clear-Host 清除屏幕的缓存
help,man 查看命令的帮助文档
mkdir,md 通过new-Item创建子目录
more 分屏输出管道结果
prompt 返回提示文本
TabExpansion Tab键的自动完成提示
X: 调用Set-Location定位到指定的驱动器根目录
如果你想查看当前Powershell环境中定义了多少个函数可以通过
PS E:mossfly.com> (dir function:).count 37 PS E:mossfly.com>
自定义Prompt
每次成功执行完一条命令,Powershell就会执行Prompt函数,提示用户进行下一步输入。默认设置中,prompt显示“PS” 和当前的工作目录
。再接着是”>”或”>>”,具体情况要看当前Powershell控制台的的层数。当然你可以自定义prompt的,那就得覆盖prompt函数:
PS E:mossfly.com> pwd
Path
----
E:mossfly.com
PS E:mossfly.com> cd ..
PS E:> Function Prompt {"www.mossfly.com"}
www.mossfly.com
www.mossfly.com pwd
Path
----
E:
www.mossfly.com $function:prompt
"www.mossfly.com"
www.mossfly.com
这样的覆盖安全吗,显然安全,对预定义函数的重写,只会在当前控制台会话中有效,当你重新启动控制台时,自然会恢复如初。
在控制台的任何位置输出文本(自定义光标的位置)
因为控制台的内容存放在控制台屏幕的缓存中,因此你可以逐个访问内容的每一行或每一个字符。你甚至可以在控制台的屏幕的任何位置输出你想要输出的信息,接下来的函数会演示这个功能。要完成这个功能,需要使用$Host.UI.Rawui ,光标的位置通过屏幕的横坐标(X)和纵坐标(Y)确定,下面的函数会首先记住当前光标的位置,然后在横坐标上增加60个占位符,然后重置光标的位置至当前位置,最后通过prompt函数回复光标的原始位置。
function prompt
{
$curPos = $host.ui.rawui.CursorPosition
$newPos = $curPos
$newPos.X+=60
$host.ui.rawui.CursorPosition = $newPos
Write-Host ("{0:D} {0:T}" -f (Get-Date)) -foregroundcolor Yellow
$host.ui.rawui.CursorPosition = $curPos
Write-Host ("PS " + $(get-location) +">") -nonewline -foregroundcolor Green
" "
}
运行结果
PS E:mossfly.com> function prompt
>> {
>> $curPos = $host.ui.rawui.CursorPosition
>> $newPos = $curPos
>> $newPos.X+=60
>> $host.ui.rawui.CursorPosition = $newPos
>> Write-Host ("{0:D} {0:T}" -f (Get-Date)) -foregroundcolor Yellow
>> $host.ui.rawui.CursorPosition = $curPos
>> Write-Host ("PS " + $(get-location) +">") -nonewline -foregroundcolor Gre
en
>> " "
>> }
>>
PS E:mossfly.com> 2012年2月28日 8:54:01
使用窗口标题栏
在Windows控制台的标题栏有一部分空间,可以放置一些有用的信息,比如当前哪个用户登录在控制台,可以通过设置$host.UI.RawUI.WindowTitle来自定义控制台标题栏的文本。
下面的例子就会演示设置标题栏文本,通过.NET方法获取当前用户信息,由于该方法会有几秒钟执行时间,为了效率考虑首先将用户信息保存在全局变量中,然后在Prompt函数中调用。
$global:CurrentUser = [System.Security.Principal.WindowsIdentity]::GetCurrent()
function prompt
{
$host.ui.rawui.WindowTitle = "Line: " + $host.UI.RawUI.CursorPosition.Y + " " + $CurrentUser.Name + " " + $Host.Name + " " + $Host.Version
Write-Host ("PS " + $(get-location) +">") -nonewline -foregroundcolor Green
return " "
}
执行以后在标题栏会显示:Line: 72 ComputerNameuser ConsoleHost 2.0
如果你使用管理员权限运行控制台时,Prompt函数还可以给出警告。使用WindowsPrincipal 辨别当前用户是否使用了管理员权限,你不需要了解下面的.NET代码,它会在全局变量中将布尔值赋值给$Admin。
$CurrentUser = [System.Security.Principal.WindowsIdentity]::GetCurrent()
$principal = new-object System.Security.principal.windowsprincipal($CurrentUser)
$global:Admin = $principal.IsInRole( [System.Security.Principal.WindowsBuiltInRole]::Administrator)
Function prompt
{
# 输出标准的提示信息:
Write-Host ("PS " + $(get-location)) -nonewline
# The rest depends on whether you have admin rights or not:
If ($admin)
{
$oldtitle = $host.ui.rawui.WindowTitle
# 将"Administrator: " 显示在标题栏
If (!$oldtitle.StartsWith("Administrator: "))
{
$host.ui.rawui.WindowTitle ="Administrator: " + $oldtitle
}
# Prompt结尾显示红色的尖括号
Write-Host ">" -nonewline -foregroundcolor Red
}
Else
{
Write-Host ">" -nonewline
}
return " "
}
没有管理员权限时,标题栏文本:Windows Powershell
有管理员权限时,标题栏文本:Administrator :管理员 : Windows Powershell
Clear-Host:删除屏幕缓存
很可能,你已经注意到了,cls可以删除屏幕的缓存。事实上,cls只是Clear-Host函数的别名,但是却看不到这个函数的内容。
PS E:mossfly.com> $function:Clear-Host
必须在“-”运算符的右侧提供值表达式。
所在位置 行:1 字符: 17
+ $function:Clear- <<<< Host
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordEx
ception
+ FullyQualifiedErrorId : ExpectedValueExpression
在Powershell中短斜杠是个特殊字符,如果一个函数名中包含了特殊字符就应当把它放在花括号中。
PS E:mossfly.com> ${function:Clear-Host}
$space = New-Object System.Management.Automation.Host.BufferCell
$space.Character = ' '
$space.ForegroundColor = $host.ui.rawui.ForegroundColor
$space.BackgroundColor = $host.ui.rawui.BackgroundColor
$rect = New-Object System.Management.Automation.Host.Rectangle
$rect.Top = $rect.Bottom = $rect.Right = $rect.Left = -1
$origin = New-Object System.Management.Automation.Host.Coordinates
$Host.UI.RawUI.CursorPosition = $origin
$Host.UI.RawUI.SetBufferContents($rect, $space)
盘符名预定义函数C:,D:,E:
这些盘符名称可以作为单独的一个函数,是怎么做到的呢?
PS E:mossfly.com> $function:c: Set-Location C: PS E:mossfly.com> $function:d: Set-Location D: PS E:mossfly.com> $function:E: Set-Location E: PS E:mossfly.com> $function:A: Set-Location A:
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
