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

Itt*_*ayD 12 productivity powershell history readline

我喜欢在 Bash 中做的一些事情,并且很想知道如何在 PowerShell 中做:

  1. 在 Bash 中,我设置了历史滚动,以便它只滚动与当前行具有相同前缀的命令。如果我想查看我的最新提交(例如重用部分评论),我会先写 'git' 然后写?.

  2. 相关当然是历史搜索Ctrl+R

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

    h | grep foo
    
    Run Code Online (Sandbox Code Playgroud)

    在 PowerShell 中,我使用:

    h -c 1000 | where {$_.commandline.contains("foo")}
    
    Run Code Online (Sandbox Code Playgroud)

    (显然我是新手,必须有更短的方法)

  4. 像:

    mv file.txt{,.bak}
    
    Run Code Online (Sandbox Code Playgroud)

    或者

    mv file.txt !#$.bak
    
    Run Code Online (Sandbox Code Playgroud)
  5. 魔法空间(!$内联扩展)

PowerShell 中有哪些替代方案?

Ryn*_*ant 15

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

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

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

# 1
$np = Start-Process notepad -PassThru
# 2
$np| get-process
# 3
$np| Stop-Process
Run Code Online (Sandbox Code Playgroud)

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

#st然后tab重复键入将循环显示 1 和 3。

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

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

'notepad'
select *
Run Code Online (Sandbox Code Playgroud)

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

3 - 您可以使用Select-String. 为其创建别名以使其易于使用(PowerShell v3 添加了别名sls)。那你就可以了。

h| sls foo
Run Code Online (Sandbox Code Playgroud)

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

gci *a.txt| ren -n {$_.Name + '.bak'}
Run Code Online (Sandbox Code Playgroud)

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


njd*_*njd 2

对于 (3),您可以将其编写为配置文件中的函数(例如%USERPROFILE%\My Documents\WindowsPowerShell\profile.ps1):

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

然后:

hh foo
Run Code Online (Sandbox Code Playgroud)

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

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