PowerShell:历史记录增强功能(readline)?

PowerShell:历史记录增强功能(readline)?

我喜欢 Bash 的一些功能,并且想知道如何在 PowerShell 中实现它们:

  1. 在 Bash 中,我设置了历史滚动,这样它只会滚动以与当前行相同的前缀开头的命令。如果我想查看我最近的提交(例如重用部分评论),我会输入“git”,然后输入

  2. 相关当然是使用Ctrl+进行历史搜索R

  3. 为了找到其他的东西,我写道:

    h | grep foo
    

    在 PowerShell 中我使用:

    h -c 1000 | where {$_.commandline.contains("foo")}
    

    (显然我是新手,一定有更短的方法)

  4. 像:

    mv file.txt{,.bak}
    

    或者

    mv file.txt !#$.bak
    
  5. 魔法空间(可!$内联扩展)

PowerShell 中有哪些替代方案?

答案1

对于 (3),你可以在个人资料中将其写为一个函数(例如%USERPROFILE%\My Documents\WindowsPowerShell\profile.ps1):

function hh ([string] $word) {
    Get-History -c 1000 | where {$_.commandline.contains($word)}
}

然后:

hh foo

但是 Powershell 最好被视为一种脚本语言,而不是交互式 shell,因为底层控制台仍然是 cmd.exe,但它有种种局限性。

因此,F7 用于交互式历史记录,F3 用于复制前一个命令,F1 用于复制单个字符,F2 用于复制前一个命令直到特定字符,等等。

答案2

1 - 您可以F8从 Windows 控制台使用它来循环显示与当前行开头匹配的命令。这是区分大小写的匹配。

2 - 您可以使用#来匹配前面的命令。使用#<partial match><tab>不区分大小写,并将匹配前面命令中任何位置的文本。

假如您有以下命令历史记录:

# 1
$np = Start-Process notepad -PassThru
# 2
$np| get-process
# 3
$np| Stop-Process

#pr然后重复输入tab将循环 1、2 和 3。

#st然后重复输入tab将循环 1 和 3。

仅使用#将匹配所有历史记录。

#也可以在输入部分命令后使用。如果您的历史记录是:

'notepad'
select *

您可以输入Get-Process #n<tab>| #s<tab>以获取Get-Process 'notepad'| select *

3 - 您可以使用Select-String。为其创建一个别名以使其易于使用(PowerShell v3 添加了别名sls)。然后您就可以这样做了。

h| sls foo

4-您可以执行以下操作:

gci *a.txt| ren -n {$_.Name + '.bak'}

5-$$匹配最后一条命令的最后一个标记,但我不知道如何以内联方式扩展它。

答案3

您应该查看 Oisin Grehan 的 PSReadline 模块:http://nivot.org/blog/post/2012/09/12/Emulating-Bash-GNU-Readline-with-PowerShell-30

代码可以在这里获取:https://bitbucket.org/oising/psreadline/overview

从偶尔使用 Windows 的经验丰富的 *nix 管理员的角度来看,通过添加用于行编辑、历史记录搜索等的基本 EMACS 绑定,这使得 PowerShell 实际上可用作 CLI。

相关内容