PowerShell 技能连载 - 使用 UTC 时间

在跨语言环境中,您可能希望有一种方法能将日期和时间“通用化”,例如在写日志的时候。和使用当地时间比起来,用 PowerShell 能够很方便地将 DateTime 对象转化为协调世界时 (UTC):

1
(Get-Date).ToUniversalTime()

PowerShell 技能连载 - 用秒表测定脚本执行时间

是否希望了解某个命令或一段脚本运行了多少时间?以下简易的秒表对象能帮您实现这个功能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# create a new stopwatch
$stopwatch = [System.Diagnostics.Stopwatch]::StartNew()

# run a command
$info = Get-Hotfix

# stop the stopwatch, and report the milliseconds
$stopwatch.Stop()
$stopwatch.Elapsed.Milliseconds

# continue the stopwatch
$stopwatch.Start()
# $stopwatch.Restart() # <- resets stopwatch

# run another command
$files = Get-ChildItem -Path $env:windir

# again, stop the stopwatch and report accumulated runtime in milliseconds
$stopwatch.Stop()
$stopwatch.Elapsed.Milliseconds

这个秒表比自己用 Get-Date 写的好用得多,并且能计算时间差。这个秒表可以停止、继续、复位,并且能随时自动汇报经历的时间。例如,您可以在检查代码时停止秒表,然后在准备执行下一条命令的时候重启秒表。

在上面的例子中,若您将第二处 Start() 改为 Restart() 则秒表将会复位并且报告的时间是第二条命令执行的时间而不是总时间。

PowerShell 技能连载 - 色彩之周: 为 PowerShell 控制台中的符号着色

支持 PowerShell 3 以上版本

本周我们将关注如何改变 PowerShell 控制台和 PowerShell ISE 的颜色,以便设置您的 PowerShell 环境。

当您在 PowerShell ISE 输入命令的时候符号会被着色,而 PowerShell 控制台并不会。如果您喜欢着色的符号,可以试试 PSReadline 这个很棒的模块。以下是下载和安装的方法:

1
PS C:\> Install-Module -Name PSReadLine -Scope CurrentUser -Force

如果不支持 “Install-Module“ 命令,那么请到 www.powershellgallery.com 下载 “PowerShellGet” MSI 安装包。它为非 PowerShell 5 的环境添加了一系列操作 Microsoft PowerShell Gallery 的功能。

安装好该模块以后,您需要加载它(在 PowerShell 控制台中,而不是在 PowerShell ISE 中):

1
PS C:\> Import-Module -Name PSReadLine

当它加载完成后,PowerShell 控制台就可以显示彩色的符号。

PowerShell 技能连载 - 色彩之周: 改变 PowerShell ISE 中的错误信息颜色

本周我们将关注如何改变 PowerShell 控制台和 PowerShell ISE 的颜色,以便设置您的 PowerShell 环境。

在前一个技能中我们介绍了如何改变 PowerShell 预设的颜色,例如错误信息颜色。

在 PowerShell ISE 中,您可将这些颜色设置为指定的 16 种控制台颜色之一:

1
2
$host.PrivateData.ErrorBackgroundColor="White"
$host.PrivateData.ErrorForegroundColor=

而且,PowerShell ISE 也接受自定义的 WPF 颜色。以下代码将设置错误信息为透明底橙色:

1
2
$host.PrivateData.ErrorBackgroundColor="#00000000"
$host.PrivateData.ErrorForegroundColor=[System.Windows.Media.Colors]::OrangeRed

PowerShell 技能连载 - 色彩之周: 改变错误信息颜色

本周我们将关注如何改变 PowerShell 控制台和 PowerShell ISE 的颜色,以便设置您的 PowerShell 环境。

PowerShell 使用预定义的颜色来显示错误信息、警告信息、详细信息,以及其他输出信息。这些颜色也可以更改。

这段代码将把错误信息改为白底红字。这个颜色更好阅读,特别在演示的时候:

1
2
$host.PrivateData.ErrorBackgroundColor="White"
$host.PrivateData.ErrorForegroundColor='Red'

PowerShell 技能连载 - 色彩之周: 在 PowerShell ISE 控制台中使用透明度

本周我们将关注如何改变 PowerShell 控制台和 PowerShell ISE 的颜色,以便设置您的 PowerShell 环境。

在钱一个技能中您学到了三个设置控制 PowerShell ISE 控制台面板中的颜色。如果您希望的话,还可以为输入和输出设置不同的背景色:

1
2
3
$psise.Options.ConsolePaneForegroundColor=[System.Windows.Media.Colors]::LightSkyBlue
$psise.Options.ConsolePaneBackgroundColor=[System.Windows.Media.Colors]::DarkGreen
$psise.Options.ConsolePaneTextBackgroundColor=[System.Windows.Media.Colors]::Yellow

结果类似这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
PS C:\>"Hello"
Hello

PS C:\>$Host


Name : Windows PowerShell ISE Host
Version : 4.0
InstanceId : 840b9f0e-0c05-4b6d-84fc-c104971ac647
UI : System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture : de-DE
CurrentUICulture: de-DE
PrivateData : Microsoft.PowerShell.Host.ISE.ISEOptions
IsRunspacePushed: False
Runspace : System.Management.Automation.Runspaces.LocalRunspace

如果您只希望将输出高亮一点点,那么可以使用透明色。文字的背景色可以变成透明,首先要确定希望使用的颜色的代码,然后用 alpha 通道创建自定义的颜色。它操作起来很简单。

在前一个例子中,文字的背景色被设置成 “Yellow”。以下是查找 “Yellow” 实际颜色值的方法:

1
2
PS C:\> [System.Windows.Media.Colors]::Yellow.ToString()
#FFFFFF00

第一个十六进制值代表 alpha 通道(不透明度)。要使黄色变得更透明,请调低这个值:

1
PS>$psise.Options.ConsolePaneTextBackgroundColor="#33FFFF00"

PowerShell 技能连载 - 色彩之周: 设置 PowerShell ISE 的背景色

本周我们将关注如何改变 PowerShell 控制台和 PowerShell ISE 的颜色,以便设置您的 PowerShell 环境。

在前一个技能中我们介绍了如何设置 PowerShell ISE 控制台的前景色,以及通过 red、green 和 blue 值指定颜色。

PowerShell ISE 的控制台的背景色也可以用这种方法,不过会产生一些副作用,需要规避。

首先我们将 PowerShell ISE 控制台面板的颜色改为绿底浅灰字:

1
2
3
4
5
6
7
8
9
10
11
PS C:\> $psise.Options.ConsolePaneForegroundColor =
[System.Windows.Media.Colors]::LightGray

PS C:\> $psise.Options.ConsolePaneBackgroundColor =
[System.Windows.Media.Colors]::DarkGreen

PS C:\>
PS C:\>"Hello"
Hello

PS C:\>

颜色改变了,但是提示符以及所有其它的输出还是原来的颜色。这是因为在 PowerShell ISE 中还有第三个设置,它决定了文字的背景色:

1
2
3
4
5
PS C:\>$psise.Options.ConsolePaneTextBackgroundColor =
[System.Windows.Media.Colors]::DarkGreen

PS C:\> "Hello"
Hello

现在看起来一切完美了。

PowerShell 技能连载 - 色彩之周: 为 PowerShell ISE 指定命名的颜色

本周我们将关注如何改变 PowerShell 控制台和 PowerShell ISE 的颜色,以便设置您的 PowerShell 环境。

在前一个技能中我们将 PowerShell ISE 控制台的前景色改为任意的自定义 RGB 颜色。您也可以从预定义的颜色种选一个:

1
2
3
PS> $psise.Options.ConsolePaneForegroundColor = [System.Windows.Media.Colors]::Azure

PS> $psise.Options.ConsolePaneForegroundColor = [System.Windows.Media.Colors]::White

在 PowerShell 控制台面板中键入这些代码时,当按下两个冒号后,智能提示将打开一个清单,列出所有预定义的颜色名。这对查找已有的名字十分有用。如果知道一个颜色名,您也可以这样写:

1
2
3
4
5
PS C:\> $psise.Options.ConsolePaneForegroundColor = 'Azure'

PS C:\> $psise.Options.ConsolePaneForegroundColor = 'DarkGray'

PS C:\> $psise.Options.ConsolePaneForegroundColor = 'White'

PowerShell 技能连载 - 颜色之周: 设置 PowerShell ISE 控制台的颜色

支持 PowerShell 3 以上版本

本周我们将关注如何改变 PowerShell 控制台和 PowerShell ISE 的颜色,以便设置您的 PowerShell 环境。

您可以通过 $host 对象改变 PowerShell ISE 控制台的背景色和前景色,这种方式提供了 16 中预设的颜色可选择:

1
2
3
4
5
PS> $host.UI.RawUI.ForegroundColor = 'Red'

PS> $host.UI.RawUI.ForegroundColor = 'White'

PS>

这些命令将前景色先改为红色,然后改回白色。

在 PowerShell ISE 中,您也可以通过 $psISE 变量修改这些颜色。在这里可以用 RGB 值构成您自己的背景色和前景色。让我们把 PowerShell ISE 控制台的前景色改为一些别的:

1
2
3
PS> $psise.Options.ConsolePaneForegroundColor = '#FFDD98'

PS> $psise.Options.ConsolePaneForegroundColor = '#FFFFFF'

第一行将前景色改为微带青色的颜色,下一行将颜色改为白色。

颜色可以用三个十六进制值构成,分别由红色、绿色和蓝色分量组成。

PowerShell 技能连载 - Saving PowerShell User Defaults

我们将要进入的“色彩之周”将带来许多改变 PowerShell ISE 编辑器和控制台颜色的技能。多数应用到 PowerShell 的改变并没有保存。PowerShell ISE 并不会保存一些颜色设置,但一个更健壮的方法是在 PowerShell 的一个描述脚本中改变您的自定义设置。

任何一个 PowerShell 宿主(控制台或 PowerShell ISE 或其它支持 PowerShell 的程序)都会执行的脚本如下:

1
2
PS C:\> $profile.CurrentUserAllHosts
C:\Users\Tobias\Documents\WindowsPowerShell\profile.ps1

Anything that applies to a specific host like the console only, or the PowerShell ISE only, goes here:

任何一个特定的 PowerShell 宿主,例如特指控制台或特指 PowerShell ISE 启动执行的脚本如下:

1
2
PS C:\>  $profile.CurrentUserCurrentHost
C:\Users\Tobias\Documents\WindowsPowerShell\XXXXXXXXXXXXXX_profile.ps1

请注意路径中的 “XXX”。需要在指定的宿主内运行上面的代码才有效。根据不同的宿主,这行代码会返回不同的路径。

另外请注意这些调用只是返回描述脚本的路径。它缺省情况下并不存在。您可能需要自己创建它,包括 “WindowsPowerShell” 文件夹。当描述脚本存在时,PowerShell 宿主启动的时候就会执行它。

请注意需要打开脚本执行功能。所以您可能需要一次性地允许脚本执行,比如:

1
PS> Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned -Force