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 中文博客

Windows管理框架(WMF) 5.0 路线图(转)

在接下来的几周之内(2015年8月)我们将会继续发布受支持的Windows 管理框架(WMF)5.0的后续“预览产品”,2015年第四个季度,您将能够下载到WMF5.0的RTM版本。

WMF 5.0的产品预览版和前几个版本的WMF5.0预览版相比,有如下不同:

  • 微软会对它提供完整支持,一直到WMF RTM 50正式发布。提供完整支持意味着,将给客户遇到的任何妨碍性问题我们都会提供调查和应对方案,甚至必要的更新。
  • 预览产品中所有功能都将会出现在最终产品中,在这个安装包中没有任何的实验性的功能。
  • 您必须在安装这个预览版之前,卸载之前的所有预览版

不管是即将到来的完整支持版本的WMF 5.0(预览产品和正式版),我们都将会经常吸收我们WMF5.0预览版用户社区提供的反馈。所以还望您尽早部署WMF 5.0产品预览版,并且提前提供建议给我们,争取让我们的RTM版本更好。

原文作者:Hemant Mahawar [MSFT] (高级项目经理)
原文链接:Windows Management Framework (WMF) 5.0 Roadmap
中译链接:Windows管理框架(WMF) 5.0 路线图 - PowerShell 中文博客

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