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

PowerShell 技能连载 - 查看 ASCII 码

这是一种查看任何字符 ASCII 码的简单办法。字符可能截取自网站或者来自从 internet 上下载的脚本。

只需要打开 PowerShell 然后输入以下代码:

1
2
3
4
5
6
7
8
9
10
11
# paste character(s)  inside the quotes

$text = ''

foreach($char in [char[]]$text)

{

'Character {0,-3} Decimal {1,-5} Hex {1,-4:X}' -f $char, [int]$char

}

下一步,将字符(可以多个)粘贴在引号内,然后运行代码。为了测试,可以在 PowerShell 中运行以下代码:

1
PS C:\> charmap

这将打开字符映射表。您可以在其中选择一种字体,例如 DingBats,以及一个或多个字符。将它们复制到剪贴板,然后将它们粘贴到上面的 PowerShell 代码中。当您运行代码时,它将以十进制和十进制两种方式返回所选字符的 ASCII 码值。它们应该和字符映射表工具状态栏显示的值相同。

PowerShell 技能连载 - 检查(本地和远程的)硬盘容量

WMI 可以提供硬盘的容量和剩余空间。PowerShell 会用返回这样的友好信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
PS C:\> # local
PS C:\> Get-HardDriveSize

DriveLetter Free(GB) Size(GB) Percent
----------- -------- -------- -------
C: 823,7 942,3 87,4


PS C:\> # remote
PS C:\> Get-HardDriveSize -ComputerName server2 -Credential server2\Tobias

DriveLetter Free(GB) Size(GB) Percent
----------- -------- -------- -------
C: 87,3 436,9 20
D: 5,3 25 21,3

以下是代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
function Get-HardDriveSize
{
param
(
$ComputerName,

$Credential
)

# get calculated properties:
$prop1 = @{
Name = 'DriveLetter'
Expression = { $_.DeviceID }
}

$prop2 = @{
Name = 'Free(GB)'
Expression = { [Math]::Round(($_.FreeSpace / 1GB),1) }
}

$prop3 = @{
Name = 'Size(GB)'
Expression = { [Math]::Round(($_.Size / 1GB),1) }
}

$prop4 = @{
Name = 'Percent'
Expression = { [Math]::Round(($_.Freespace * 100 / $_.Size),1) }
}

# get all hard drives
Get-CimInstance -ClassName Win32_LogicalDisk @PSBoundParameters -Filter "DriveType=3" |
Select-Object -Property $prop1, $prop2, $prop3, $prop4
}

PowerShell 技能连载 - 启用远程管理

支持 PowerShell 2 以上版本

许多早先基于 DCOM 的命令需要打开“远程管理防火墙例外”,才能访问远程系统。其中包含 Get-WmiObject 等 Cmdlet。

一个启用该功能的简单办法是在管理员权限下运行以下命令:

1
netsh firewall set service remoteadmin enable

虽然该命令已经准备淘汰,不过它仍然能用,而且是配置防火墙的最简单方法。

PowerShell 技能连载 - 查找自启动项

支持 PowerShell 3 以上版本

If you’d like to know which programs start automatically on your machine, WMI may help:

如果您想了解有多少个程序随着您的机器自动启动,WMI 也许能帮上忙:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
PS C:\> Get-CimInstance -ClassName Win32_StartupCommand | Select-Object -Property Name, Location, User, Command, Description

Name : OneDrive
Location : HKU\S-1-5-21-2012478179-265285931-690539891-1001\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
User : DESKTOP-7AAMJLF\tobwe
Command : "C:\Users\tobwe\AppData\Local\Microsoft\OneDrive\OneDrive.exe" /background
Description : OneDrive

Name : Bluetooth
Location : Common Startup
User : Public
Command : C:\PROGRA~1\WIDCOMM\BLUETO~1\BTTray.exe
Description : Bluetooth

Name : Snagit 12
Location : Common Startup
User : Public
Command : C:\PROGRA~2\TECHSM~1\SNAGIT~1\Snagit32.exe
Description : Snagit 12

Name : RTHDVCPL
Location : HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
User : Public
Command : "C:\Program Files\Realtek\Audio\HDA\RtkNGUI64.exe" -s
Description : RTHDVCPL

...