自定义PowerShell提示-等同于CMD的$ M $ P $ _ $$$$ G?
时间:2020-03-06 14:58:44 来源:igfitidea点击:
我已经开始使用PowerShell进行"玩耍",并试图使其表现为"行为"。
我想做的一件事是自定义PROMPT,使其与MS-Dos上的" $ M $ P $ _ $ + $ G""相似":
这些功能的简要概述:
字符|描述
$ m与当前驱动器号关联的远程名称,如果当前驱动器不是网络驱动器,则为空字符串。
$ p当前驱动器和路径
$ _ ENTER-LINEFEED
$ +零个或者多个加号(+)字符,取决于所推目录堆栈的深度,每推入一个级别一个字符
$ g>(大于号)
所以最终输出是这样的:
\spma1fp1\JARAVJ$ H:\temp ++>
我已经能够在提示符下添加$ M
和$ _
功能(以及漂亮的历史记录功能),如下所示:
function prompt { ## Get the history. Since the history may be either empty, ## a single item or an array, the @() syntax ensures ## that PowerShell treats it as an array $history = @(get-history) ## If there are any items in the history, find out the ## Id of the final one. ## PowerShell defaults the $lastId variable to '0' if this ## code doesn't execute. if($history.Count -gt 0) { $lastItem = $history[$history.Count - 1] $lastId = $lastItem.Id } ## The command that we're currently entering on the prompt ## will be next in the history. Because of that, we'll ## take the last history Id and add one to it. $nextCommand = $lastId + 1 ## Get the current location $currentDirectory = get-location ## Set the Windows Title to the current location $host.ui.RawUI.WindowTitle = "PS: " + $currentDirectory ## And create a prompt that shows the command number, ## and current location "PS:$nextCommand $currentDirectory >" }
但是剩下的还不是我设法复制的。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
非常感谢我们一定会收到的提示!
解决方案
这将为我们提供压入堆栈中位置的数量:
$(get-location -Stack).count
看看这是否满足要求:
function prompt { ## Get the history. Since the history may be either empty, ## a single item or an array, the @() syntax ensures ## that PowerShell treats it as an array $history = @(get-history) ## If there are any items in the history, find out the ## Id of the final one. ## PowerShell defaults the $lastId variable to '0' if this ## code doesn't execute. if($history.Count -gt 0) { $lastItem = $history[$history.Count - 1] $lastId = $lastItem.Id } ## The command that we're currently entering on the prompt ## will be next in the history. Because of that, we'll ## take the last history Id and add one to it. $nextCommand = $lastId + 1 ## Get the current location $currentDirectory = get-location ## Set the Windows Title to the current location $host.ui.RawUI.WindowTitle = "PS: " + $currentDirectory ##pushd info $pushdCount = $(get-location -stack).count $pushPrompt = "" for ($i=0; $i -lt $pushdCount; $i++) { $pushPrompt += "+" } ## And create a prompt that shows the command number, ## and current location "PS:$nextCommand $currentDirectory `n$($pushPrompt)>" }
多亏了EBGReens的回答,我的"提示"现在能够显示堆栈的深度:
function prompt { ## Initialize vars $depth_string = "" ## Get the Stack -Pushd count $depth = (get-location -Stack).count ## Create a string that has $depth plus signs $depth_string = "+" * $depth ## Get the history. Since the history may be either empty, ## a single item or an array, the @() syntax ensures ## that PowerShell treats it as an array $history = @(get-history) ## If there are any items in the history, find out the ## Id of the final one. ## PowerShell defaults the $lastId variable to '0' if this ## code doesn't execute. if($history.Count -gt 0) { $lastItem = $history[$history.Count - 1] $lastId = $lastItem.Id } ## The command that we're currently entering on the prompt ## will be next in the history. Because of that, we'll ## take the last history Id and add one to it. $nextCommand = $lastId + 1 ## Get the current location $currentDirectory = get-location ## Set the Windows Title to the current location $host.ui.RawUI.WindowTitle = "PS: " + $currentDirectory ## And create a prompt that shows the command number, ## and current location "PS:$nextCommand $currentDirectory `n$($depth_string)>" }
以下内容将为我们提供$ m的等值金额。
$mydrive = $pwd.Drive.Name + ":"; $networkShare = (gwmi -class "Win32_MappedLogicalDisk" -filter "DeviceID = '$mydrive'"); if ($networkShare -ne $null) { $networkPath = $networkShare.ProviderName }
感谢以下中的提示:
在PowerShell中,如何确定当前驱动器是否为网络驱动器?
在PowerShell中,如何确定驱动器的根目录(假设它是网络驱动器)
我设法使它起作用。
我的完整个人资料是:
function prompt { ## Initialize vars $depth_string = "" ## Get the Stack -Pushd count $depth = (get-location -Stack).count ## Create a string that has $depth plus signs $depth_string = "+" * $depth ## Get the history. Since the history may be either empty, ## a single item or an array, the @() syntax ensures ## that PowerShell treats it as an array $history = @(get-history) ## If there are any items in the history, find out the ## Id of the final one. ## PowerShell defaults the $lastId variable to '0' if this ## code doesn't execute. if($history.Count -gt 0) { $lastItem = $history[$history.Count - 1] $lastId = $lastItem.Id } ## The command that we're currently entering on the prompt ## will be next in the history. Because of that, we'll ## take the last history Id and add one to it. $nextCommand = $lastId + 1 ## Get the current location $currentDirectory = get-location ## Set the Windows Title to the current location $host.ui.RawUI.WindowTitle = "PS: " + $currentDirectory ## Get the current location's DRIVE LETTER $drive = (get-item ($currentDirectory)).root.name ## Make sure we're using a path that is not already UNC if ($drive.IndexOf(":") -ne "-1") { $root_dir = (get-wmiobject Win32_LogicalDisk | ? {$_.deviceid -eq $drive.Trim("\") } | % { $_.providername })+" " } else { $root_dir="" } ## And create a prompt that shows the command number, ## and current location "PS:$nextCommand $root_dir$currentDirectory `n$($depth_string)>" }