PowerShell 技能连载 - 向 PowerShell ISE 添加测试宿主

要在随 PowerShell 3.0 以上版本发行的 PowerShell ISE 中打开一个新的测试宿主,这是一个小小的辅助函数:

#requires -Version 3

function New-PSHost
{
    param
    (
        [Parameter(Mandatory = $true)]
        $Name
    )

    $newTab = $psise.PowerShellTabs.Add()
    $newTab.DisplayName = $Name
}

当您运行该函数并且输入 New-PSHost 之后,您会收到一个输入名字的提示。请键入新的测试宿主的名字,并按下 ENTER 键,PowerShell ISE 将会在一个新的 PowerShell 标签页中打开一个新的 PowerShell 宿主,并且标签页以您起的名字命名。

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 的方式提交用户名。密码将会以安全的方式提示输入。