我爱上了 PowerShell。它是脚本(power)的丰富功能和可读性以及命令行(shell)的简洁性的完美结合。但关于 PowerShell 跨平台开源的卓越性的长篇大论最好留到另一篇文章中(我已经写过一篇,如果你想让你的生命有意义,你必须阅读这篇文章)。
一旦你接受了 PowerShell 进入你的内心和你的笔记本电脑,本文中的技巧可以帮助你按照你喜欢的方式调整 PowerShell,让你享受数小时的 PowerShell 乐趣。
配置启动设置
Bash 用户会熟悉 .bashrc
或 .bash_profile
文件,其中包含每次 shell 实例启动时运行的命令。PowerShell 也有类似的文件,尽管它的位置是系统特定的。该文件的完整路径在 PowerShell 的 $profile
变量中可用。如果你希望使用下面描述的任何或所有调整,只需将它们放入此文件中。
叮咚,叮咚声消失了
如果你在 Windows 上运行 PowerShell(别担心,我们不会评判你),你可能会遇到一个小小的听觉滋扰:如果你在空提示符下按退格键,你可能会听到烦人的铃声。你可以使用以下命令将其关闭
Set-PSReadlineOption -BellStyle None
在 Windows 上使用 Tab 键
Tab 补全是 PowerShell 最令人惊叹的功能之一。当你在 Linux 或 MacOS 上键入 cmdlet 或参数的一部分,然后按 Tab 键时,PowerShell 将显示你键入的 cmdlet 或参数的所有可能的补全。你甚至可以只键入 cmdlet 的名称,后跟一个连字符,然后按 Tab 键快速查看所有参数
PS /home/yevster/Documents/ArticlesInProgress> Get-Command -
Name ArgumentList InformationAction
Verb All ErrorVariable
Noun ListImported WarningVariable
Module ParameterName InformationVariable
FullyQualifiedModule ParameterType OutVariable
CommandType Verbose OutBuffer
TotalCount Debug PipelineVariable
Syntax ErrorAction
ShowCommandInfo WarningAction
不幸的是,Windows 上的默认行为是不同的。当你在 Windows 上键入 cmdlet 或参数的一部分时,PowerShell 将仅提供第一个可用的补全。然后你可以再次(以及再次和再次)按 Tab 键以循环浏览其他补全。真糟糕!
幸运的是,修复这种令人厌恶的行为比描述它所用的时间要少得多。只需将此行添加到你的 $profile
中
Set-PSReadlineOption -EditMode Emacs
白色背景上的污点
如果你已将终端配置为在白色背景上使用黑色文本,则在使用 PowerShell 时可能会遇到丑陋的情况

尽管 PowerShell 继承了父终端的背景色和前景色,但它独立地对命令行上的特定标记进行着色。例如,默认情况下,对象成员和数字被着色为白色,这使得它们在白色背景上难以看清。
幸运的是,通过将这个小小的技巧添加到你的 $profile
中,这个问题很容易解决
$colorScheme = @{
None = "Black";
Comment = "DarkMagenta";
Keyword = "DarkGreen";
String = "DarkBlue";
Operator = "DarkRed";
Variable = "DarkGreen";
Command = "DarkRed";
Parameter = "DarkGreen";
Type = "DarkGray";
Number = "DarkGray";
Member = "DarkGray";
}
$colorScheme.Keys | % { Set-PSReadlineOption -TokenKind $_ -ForegroundColor $colorScheme[$_] }
随意调整上面 $colorScheme
映射以符合你的喜好(好像你需要我的许可)。你可以通过键入 [ConsoleColor].GetEnumNames()
来查看所有可用的颜色选项。
让提示符更友好
你可以自定义 PowerShell 提示符以显示你想要的任何内容:时间、你的用户名、关于你同事的侮辱。要自定义提示符,你需要做的就是定义一个名为 prompt
的函数。此函数返回的字符串将是你的 PowerShell 提示符。
以下是我的提示符通常的样子
07:10PM /home/yevster>
我说“通常”是因为我添加了一个巧妙的小技巧:当命令(或 cmdlet)以错误状态退出时,我已经操纵 PowerShell 来告诉我

如上面的示例所示,当写入标准错误的消息被恶意抑制时,查看返回状态可能会有所帮助。
以下是我在我的 $profile
中配置 PowerShell 提示符的方式(你也可以这样做)
function prompt {
$lastResult = Invoke-Expression '$?'
if (!$lastResult) {
Write-Host "Last command exited with error status." -ForegroundColor Red
}
Write-Output "${msg}$(
# Show time as 12:05PM
Get-Date -UFormat "%I:%M%p"
# Show current directory
) $(Get-Location)> "
}
关键在于组合键
PowerShell 提供了大量方法来最大限度地减少输入。Tab 补全是一种。别名是另一种。这里还有一个:你可以配置 PowerShell 以响应你选择的组合键(chord)来执行特定的脚本块。
让我们想象一下,我是一个社交媒体成瘾者,并且想轻松地强迫性地查看 Facebook。我会将此行添加到我的 $profile
中
Set-PSReadlineKeyHandler -Chord Ctrl+F -ScriptBlock { google-chrome https://# }
你需要确保你指定的组合键尚未被你的终端应用程序使用。如果是,则组合键可能不会被转发到 PowerShell。
以下是组合键绑定功能的一个更有效率的用途:使用一个快速的组合键将更改提交到 Git 并将其推送到远程仓库 origin
Set-PSReadlineKeyHandler -Chord Ctrl+G -ScriptBlock {
$message = Read-Host "Please enter a commit message"
/usr/bin/git commit -m "$message" | Write-Host
$branch = (/usr/bin/git rev-parse --abbrev-ref HEAD)
Write-Host "Pushing ${branch} to remote"
/usr/bin/git push origin $branch | Write-Host
}
注意: 通过组合键启动的任何命令的标准输出将不会显示在终端中。如果你确实想在终端中查看命令的输出,请将其管道传输到 Write-Host
CMDlet,就像我在上面的示例中所做的那样。
结局好一切都好
既然你勇敢地忍受了我的滔天双关语走到了这一步,我希望你在此过程中使你的 PowerShell 使用起来更加愉快。如果你有任何我遗漏的喜欢的技巧,我很乐意看到它们。请评论和/或 在 Twitter 上给我发推文。
PowerShelling 快乐!
9 条评论