-
到目前为止,这个函数只是仅仅输出了管道的结果,并没有其它比较强大的功能。在接下来的例子中,函数将会对管道的结果做进一步处理。函数名MarkEXE,将会检查Dir的结果,并高亮标记后缀名为EXE的文件名为红色。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Function MarkEXE { # 保存控制台当前的前景色 $oldcolor = $host.ui.rawui.ForegroundColor # 通过循环逐条检查管道的结果 Foreach ($element in $input) { # 如果后缀名为.exe,设置为前景色为红色 If ($element.name.toLower().endsWith(".exe")) { $host.ui.Rawui.ForegroundColor = "red" } Else { # 否则恢复默认的前景色 $host.ui.Rawui.ForegroundColor = $oldcolor } # 输出数组元素 $element } # 最后,重置控制台的前景色: $host.ui.Rawui.ForegroundColor = $oldcolor }查看全部
-
低效率的顺序模式:$input 在最简单的情况下,你的函数不是真正支持管道。只能对前一个命令执行后的结果处理。前一个命令执行的结果通过被自动保存在$input变量中,$input是一个数组,它可以包含许多元素,一个元素,甚至一个元素都没有,这取决于具体的环境。 下面的例子,是一个函数,仅仅输出$input的内容。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 PS E:mossfly.com> Function output >> { >> $input >> } >> PS E:mossfly.com> output PS E:mossfly.com> 1,2,3 | output 1 2 3 PS E:mossfly.com> dir | output 目录: E:mossfly.com Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 2012/2/28 23:34 a d---- 2012/2/28 23:35 b d---- 2012/2/28 23:35 c查看全部
-
一个函数能够访问和进一步处理另外一条命令的结果吗?答案是肯定的,这被称为管道。管道有两种模式,一种是顺序处理模式,一种是流处理模式。查看全部
-
盘符名预定义函数C:,D:,E: 这些盘符名称可以作为单独的一个函数,是怎么做到的呢? 1 2 3 4 5 6 7 8 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:查看全部
-
Clear-Host:删除屏幕缓存 很可能,你已经注意到了,cls可以删除屏幕的缓存。事实上,cls只是Clear-Host函数的别名,但是却看不到这个函数的内容。 1 2 3 4 5 6 7 PS E:mossfly.com> $function:Clear-Host 必须在“-”运算符的右侧提供值表达式。 所在位置 行:1 字符: 17 + $function:Clear- <<<< Host + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordEx ception + FullyQualifiedErrorId : ExpectedValueExpression 在Powershell中短斜杠是个特殊字符,如果一个函数名中包含了特殊字符就应当把它放在花括号中。 1 2 3 4 5 6 7 8 9 10 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)查看全部
-
如果你使用管理员权限运行控制台时,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控制台的标题栏有一部分空间,可以放置一些有用的信息,比如当前哪个用户登录在控制台,可以通过设置$host.UI.RawUI.WindowTitle来自定义控制台标题栏的文本。 下面的例子就会演示设置标题栏文本,通过.NET方法获取当前用户信息,由于该方法会有几秒钟执行时间,为了效率考虑首先将用户信息保存在全局变量中,然后在Prompt函数中调用。 1 2 3 4 5 6 7 $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查看全部
-
function prompt { Write-Host ("{0:D} {0:T} ->" -f (Get-Date)) -NoNewline -foregroundcolor green " " } 2014年12月10日 22:56:41 -> $a=1 2014年12月10日 22:56:47 -> $b=2 2014年12月10日 22:56:58 -> $a,$b=$b,$a 2014年12月10日 22:57:07 -> $a查看全部
-
在控制台的任何位置输出文本(自定义光标的位置) 因为控制台的内容存放在控制台屏幕的缓存中,因此你可以逐个访问内容的每一行或每一个字符。你甚至可以在控制台的屏幕的任何位置输出你想要输出的信息,接下来的函数会演示这个功能。要完成这个功能,需要使用$Host.UI.Rawui ,光标的位置通过屏幕的横坐标(X)和纵坐标(Y)确定,下面的函数会首先记住当前光标的位置,然后在横坐标上增加60个占位符,然后重置光标的位置至当前位置,最后通过prompt函数回复光标的原始位置。 1 2 3 4 5 6 7 8 9 10 11 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 " " } 运行结果 1 2 3 4 5 6 7 8 9 10 11 12 13 14 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 en >> " " >> } >> PS E:mossfly.com> 2012年2月28日 8:54:01查看全部
-
自定义Prompt 每次成功执行完一条命令,Powershell就会执行Prompt函数,提示用户进行下一步输入。默认设置中,prompt显示“PS” 和当前的工作目录 。再接着是”>”或”>>”,具体情况要看当前Powershell控制台的的层数。当然你可以自定义prompt的,那就得覆盖prompt函数: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 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 这样的覆盖安全吗,显然安全,对预定义函数的重写,只会在当前控制台会话中有效,当你重新启动控制台时,自然会恢复如初。查看全部
-
预定义的函数可以做很多重要的工作。 Clear-Host 清除屏幕的缓存 help,man 查看命令的帮助文档 mkdir,md 通过new-Item创建子目录 more 分屏输出管道结果 prompt 返回提示文本 TabExpansion Tab键的自动完成提示 X: 调用Set-Location定位到指定的驱动器根目录查看全部
-
\\\\\\\\\\\\查看全部
-
\\\\\\\\\\\\\\查看全部
-
\\\\\\\\\\\查看全部
-
\\\\\\查看全部
举报
0/150
提交
取消