![PowerShell:历史记录增强功能(readline)?](https://linux22.com/image/1229493/PowerShell%EF%BC%9A%E5%8E%86%E5%8F%B2%E8%AE%B0%E5%BD%95%E5%A2%9E%E5%BC%BA%E5%8A%9F%E8%83%BD%EF%BC%88readline%EF%BC%89%EF%BC%9F.png)
我喜欢 Bash 的一些功能,并且想知道如何在 PowerShell 中实现它们:
在 Bash 中,我设置了历史滚动,这样它只会滚动以与当前行相同的前缀开头的命令。如果我想查看我最近的提交(例如重用部分评论),我会输入“git”,然后输入↑。
相关当然是使用Ctrl+进行历史搜索R
为了找到其他的东西,我写道:
h | grep foo
在 PowerShell 中我使用:
h -c 1000 | where {$_.commandline.contains("foo")}
(显然我是新手,一定有更短的方法)
像:
mv file.txt{,.bak}
或者
mv file.txt !#$.bak
魔法空间(可
!$
内联扩展)
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。