PowerShell 技能连载 - 显示对话框

PowerShell 可以操作所有公公的 .NET 类,所以创建一个对话框真的很简单:

1
2
3
$result = [System.Windows.MessageBox]::Show('Do you want to restart?','Restart','YesNo','Warning')

$result

然而,您可能需要知道参数所支持的值。PowerShell 可以方便地将 .NET 调用封装成 PowerShell 函数,并提供所有参数的智能感知功能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#requires -Version 3.0

Add-Type -AssemblyName PresentationFramework

function Show-MessageBox
{
param
(
[Parameter(Mandatory)]
[String]
$Prompt,

[String]$Title = 'PowerShell',

[Windows.MessageBoxButton]$Button = 'OK',

[Windows.MessageBoxImage]$Icon = 'Information'
)

[Windows.MessageBox]::Show($Prompt, $Title, $Button, $Icon)
}

当您运行这段代码后,就得到了一个超级简单的 “Show-MessageBox“ 函数。它可以接受多个参数并且通过自动完成和智能感知为您提供正确的数据。

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'

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

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