PowerShell 技能连载 - 在 PowerShell ISE 中使用 PowerShell Tabs

随着 PowerShell 3.0 及以上版本发行的 PowerShell ISE 实际上是一个多宿主。它可以容纳多个单独的 PowerShell 实例。

要添加一个新的 PowerShell 宿主,请按 CTRL + T。然后输入 Enter-PSSession,并按下 CTRL + SHIFT + R 就能创建一个连接到远程系统的新的 PowerShell 宿主。

每个新的 PowerShell 宿主界面在 PowerShell ISE 中体现为一个新的标签页,名字为“PowerShell1”、“PowerShell2”、“PowerShell3”等。

在 ISE 中多个独立的 PowerShell 宿主十分有用。例如,希望在一个干净的环境里测试 test-drive 代码。

如果您愿意的话,甚至可以对标签进行重命名,来更好地体现它所表示的内容:

PS> $psise.CurrentPowerShellTab.DisplayName = 'Testing'

请注意只有在至少有 2 个以上 PowerShell 宿主时,才会显示 PowerShell 标签。您可能需要先按下 CTRL + T 才能够看到重命名的效果。

PowerShell 技能连载 - 定义缺省参数

PowerShell 可以为任意参数定义缺省值,所以如果您总是需要传同一个缺省值给 Get-ChildItem-Path 参数,那么可以这么做:

PS> $PSDefaultParameterValues['Get-ChildItem:Path'] = 'C:\$Recycle.Bin'

当您运行 Get-ChildItem(或它的别名,例如 dir),并且没有传入 -Path 参数时,PowerShell 总是会使用 $PSDefaultParameterValues 变量中定义的值。

您也可以使用通配符。例如,如果您希望对所有 AD 命令的 -Server 参数设置缺省值,请试试这段代码:

PS> $PSDefaultParameterValues['*-AD*:Server'] = 'dc-01'

$PSDefaultParameterValues 实际上是一个哈希表,所以您可以覆盖缺省值,或将当前定义的所有缺省值导出成列表:

Name                           Value
----                           -----
*-AD*:Server                   dc-01
Get-ChildItem:Path             C:\$Recycle.Bin

要清空所有缺省参数,请清除哈希表:

PS> $PSDefaultParameterValues.Clear()

PowerShell 技能连载 - 输出的同时赋值

如果您想将某个命令的结果赋给一个变量,并且同时输出结果,以下是两种实现方法:

您可以使用小括号:

PS> ($result = Get-Service)

Status   Name               DisplayName
------   ----               -----------
Running  AdobeARMservice    Adobe Acrobat Update Service
(...)

或者使用 OutVariable 通用参数:

PS> Get-Service -OutVariable result

Status   Name               DisplayName
------   ----               -----------
Running  AdobeARMservice    Adobe Acrobat Update Service
(...)

PowerShell 技能连载 - 通用属性和可选的通用属性

cmdlet 和高级的 PowerShell 函数可以拥有自己的参数,但它们通常继承了通用的参数。

要查看通用参数的列表,请试试这段代码:

PS> [System.Management.Automation.Cmdlet]::CommonParameters
Verbose
Debug
ErrorAction
WarningAction
ErrorVariable
WarningVariable
OutVariable
OutBuffer
PipelineVariable

结果视 PowerShell 的版本可能会有不同。在 PowerShell 5.0 中,增加了两个通用的参数。

有些 cmdlet 可能有额外的通用参数。要列出这些参数,请试试这段代码:

PS> [System.Management.Automation.Cmdlet]::OptionalCommonParameters
WhatIf
Confirm
UseTransaction

PowerShell 技能连载 - 逐行显示对象的属性

有些时候您可能需要查看某个对象中包含的数据。例如,如果您查询 PowerShell 的进程并将它显示在一个网格视图窗口中,您可以查看对象的内容:

Get-Process -Id $pid | Out-GridView

但这样真的容易查看吗?这个对象显示在一行里,而且一个潜在的限制是网格视图窗口最多只能显示 30 列。由于所有信息都显示在一行里,您也无法搜索属性,因为总是整行被同时选中。

能否更友好地逐行显示对象属性呢?以下是实现方法:

$object = Get-Process -Id $pid
($object | Get-Member -MemberType *Property).Name |
  ForEach-Object {

      New-Object PSObject -Property ([Ordered]@{Property=$_; Value=$object.$_ })

  } | Out-GridView

现在,每个属性各显示在一行上,可以尽可能多地显示,而且可以根据内容搜索某个特定的属性。

PowerShell 技能连载 - 列出(并检查)PowerShell 用户配置

用户配置脚本指的是当 PowerShell 启动时自动执行的 PowerShell 脚本。主用户配置脚本的路径可以通过 $profile 获得。

要获得所有可能的用户配置脚本路径,可以使用以下代码:

#requires -Version 1
($profile | Get-Member -MemberType NoteProperty).Name | ForEach-Object { $profile.$_ }

要检查您机器上的所有用户配置,请使用这段示例代码:

#requires -Version 3
($profile | Get-Member -MemberType NoteProperty).Name |
  ForEach-Object {
      $path = $profile.$_
      New-Object PSObject -Property ([Ordered]@{Path=$Path; Exists=(Test-Path $Path) })

  }

输出结果类似如下:

Path                                                                            Exists
----                                                                            ------
C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1                           False
C:\Windows\System32\WindowsPowerShell\v1.0\Microsoft.PowerShellISE_profile.ps1   False
C:\Users\user09\Documents\WindowsPowerShell\profile.ps1                           True
C:\Users\user09\Documents\WindowsPowerShell\Microsoft.PowerShellISE_profile.ps1   True

这个例子有趣的地方是如何编程获取对象的属性。您可以使用 Get-Member 来查找某个对象的属性名。我们将在接下来的文章中介绍这个隐藏的技能。

PowerShell 技能连载 - 只用一行代码创建新对象

有些时候您可能需要创建自己的对象来存储一系列信息。以下这行简洁的单行代码演示了如何快速创建新的对象:

#requires -Version 3

$Info = 'Test'
$SomeOtherInfo = 12

New-Object PSObject -Property ([Ordered]@{Location=$Info; Remark=$SomeOtherInfo })

这段代码的执行后将创建包含 Location 和 Remark 两个属性的新对象。只需要重命名哈希表中的键名,即可改变对象的属性名。

Location Remark
-------- ------
Test         12

请注意 [Ordered] 是 PowerShell 3.0 引入的,能够创建有序的哈希表。在 PowerShell 2.0 中,可以使用不带 [ordered] 的代码。不带它会导致新对象中的属性顺序是随机的。

PowerShell 技能连载 - 映射网络驱动器(第 3 部分)

如果您从 VBScript 迁移到 PowerShell,您也许会记得 VBScript 如何映射网络驱动器。这个选项在 PowerShell 中仍然有效。

$helper = New-Object -ComObject WScript.Network

$helper.MapNetworkDrive('O:','\\dc-01\somefolder',$true)
$helper.EnumNetworkDrives()

Test-Path -Path O:\
explorer.exe O:\
Get-PSDrive -Name O


$helper.RemoveNetworkDrive('O:', $true, $true)

如果您希望以不同的凭据登录,请使用这种方式:

$helper.MapNetworkDrive('O:','\\dc-01\somefolder',$true, 'training\user02', 'topSecret')

PowerShell 技能连载 - 映射网络驱动器(第 2 部分)

从 PowerShell 3.0 开始,您可以使用 New-PSDrive 命令来映射网络驱动器。它们也可以在文件管理器中显示。以下是一些示例代码:

#requires -Version 3

New-PSDrive -Name N -PSProvider FileSystem -Root '\\dc-01\somefolder' -Persist

Test-Path -Path N:\
explorer.exe N:\
Get-PSDrive -Name N

Remove-PSDrive -Name N -Force

如果您希望提供登录凭据,请在 New-PSDrive 命令后添加 -Credential 参数,并且以 domain\username 的方式提交用户名。密码将会以安全的方式提示输入。

PowerShell 技能连载 - 映射网络驱动器(第 1 部分)

PowerShell 支持控制台命令,所以如果您需要映射一个网络驱动器,通常最可靠的方式是使用传统好用的 net.exe,类似这样:

#requires -Version 1
net.exe use M: '\\dc-01\somefolder' /PERSISTENT:YES

Test-Path -Path M:\

explorer.exe M:\

如果您忽略“/PERSISTENT:YES”参数,那么映射的驱动器将只是临时的,注销并登录后将不会自动重连。

请注意如果驱动器号 M: 已在使用中,将会收到一个错误。将 M: 换成一个星号,将自动使用下一个可用的驱动器号。

要提交登录凭据,请使用这种方法:

net.exe use * '\\dc-01\somefolder' /PERSISTENT:YES /USER:training\user03 *

这将以 training\user03 的身份登录,并使用下一个可用的驱动器号,并且交互式地询问密码。请注意这只能在普通的 PowerShell 控制台中使用。它不能在 PowerShell ISE 中使用,因为 PowerShell ISE 并没有一个真实的控制台,所以无法交互式地询问密码。

要提交密码,将用户名之后的星号替换为密码。这当然不是很好的实践,因为这将把密码透露给所有可以查看代码的人。