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


12

我喜欢在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中有哪些替代方案?

Answers:


2

对于(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,等等。


1
底层控制台仍然是cmd吗?我不这么认为。
sinni800

1
控制台是Windows控制台子系统,cmd和任何其他控制台应用程序也使用该子系统。它有很多奇怪的东西,例如流和命令编辑以及奇怪的选择和TAB完成。Powershell ISE v3很好,但不能与“旧版”控制台应用程序很好地配合使用。Cmdlet在ISE中很棒。
杰伊·巴祖兹

15

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

2-您可以#用来匹配先前的命令。using #<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- $$匹配最后一个命令的最后一个标记,但是我不知道一种内联扩展它的方法。


2

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.