我爱上了 PowerShell。它是脚本编写(power)的功能丰富性和可读性以及命令行(shell)的简洁性的完美结合。但是,关于 PowerShell 跨平台开源的强大功能的长篇大论最好留给另一篇文章(我已经写过这篇文章,如果你希望你的人生有意义,你必须阅读它)。
一旦你接受了 PowerShell 并将其安装到你的笔记本电脑上,本文中的技巧可以帮助你按照自己喜欢的方式调整 PowerShell,让你在 PowerShell 的乐趣中度过数小时。
配置启动设置
Bash 用户会熟悉 .bashrc
或 .bash_profile
文件,其中包含每次 shell 实例启动时运行的命令。PowerShell 也有一个类似的文件,尽管其位置是特定于系统的。该文件的完整路径在 PowerShell 的 $profile
变量中可用。如果你希望使用下面描述的任何或所有技巧,只需将它们放入此文件中即可。
叮咚,提示音已死
如果你在 Windows 上运行 PowerShell(别担心,我们不会评判你),你可能会遇到一个小的听觉问题:如果你在空提示符中按 Backspace 键,你可能会听到烦人的铃声。你可以使用以下命令将其关闭
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 以响应你选择的键组合(快捷键)来执行特定的脚本块。
让我们想象一下,我是一个社交媒体成瘾者,并希望轻松地强迫性地查看 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 条评论