PowerShell 技能连载 - 创建真实的类

PowerShell 5.0 开始引入了类的概念,不过您也可以在 PowerShell 的其它版本中使用自定义类。只需要用 C# 代码来定义真正的类,然后用 Add-Type 来编译这些类。

以下是一个创建一个名为“myClass”,包含三个属性的新类。PowerShell 接下来可以用 New-Object 命令创建对象。

$code = '
    using System;
    public class myClass
    {
        public bool Enabled { get; set; }
        public string Name { get; set; }
        public DateTime Time { get; set; }


    }

'

Add-Type -TypeDefinition $code
$instance = New-Object -TypeName myClass
$instance.Enabled = $true
$instance.Time = Get-Date
$instance.Name = $env:username
$instance

为什么需要这么做呢?自定义的类可以包含来自多个来源的信息,而且您可以使用 C# 的各种复杂特性来定义您的类,包括方法、动态和静态成员等。

显然,拥有一些技术背景的开发人员对这种技术最感兴趣。

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官网主页(转)

筹划了很久,一直想搭建一个独立的PowerShell主页,来展示我们分散在其它网站上面大量的PowerShell资源。比如PowerShell脚本库,博客,Connect,GitHub仓库和TechNet文档,显然PowerShell已经在很多地方立足了。

今天我们很荣幸的宣布新版的PowerShell主页正式上线。
https://msdn.microsoft.com/en-us/powershell

我们很努力地为PowerShell建立了一个新版的主页。第一个发布版本给用户提供了一个集成了官方的PowerShell资源,内容,文档的统一门户。新版的Powershell主页让我们的在线品牌体验更现代化,它有一个简单的导航栏和一个响应式的,移动端友好的界面设计。我们计划让它成长为一个PowerShell社区相关的一站式商店。

在接下来的两周中,我们会对网站的某些方面稍加润色,同时添加一些额外的内容来展示我们社区生态系统中的亮点。我们会快速迭代,将会由微软PowerShell内部团队对网站进行直接维护。如果您有任何问题,建议和反馈,请(在原文下面)随时留下评论,或着关注我的tweet(@joeyaiello) 或着 Neema Saeedi (@neems)。

荔非苔注:截至本文发稿,对应的PowerShell中文主页依然是旧版。

原文作者:Joey Aiello(PowerShell项目经理)
原文链接:Welcoming the new home of PowerShell
中译链接:欢迎使用新版的PowerShell官网主页 - PowerShell 中文博客