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

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 并没有一个真实的控制台,所以无法交互式地询问密码。

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

PowerShell 技能连载 - 指定执行超时

Start-Process 可以启动进程但是不支持超时。如果您需要在指定的超时时间后结束一个跑飞了的进程,您可以使用类似这样的方法:

#requires -Version 2

$maximumRuntimeSeconds = 3

$process = Start-Process -FilePath powershell.exe -ArgumentList '-Command Start-Sleep -Seconds 4' -PassThru

try
{
    $process | Wait-Process -Timeout $maximumRuntimeSeconds -ErrorAction Stop
    Write-Warning -Message 'Process successfully completed within timeout.'
}
catch
{
    Write-Warning -Message 'Process exceeded timeout, will be killed now.'
    $process | Stop-Process -Force
}

Wait-Process 用于等待进程执行。如果它没有在指定的超时之内结束,Wait-Process 将抛出一个异常。在相应的错误处理器中可以决定要如何处理。

在这个例子中,catch 代码块将结束进程。

这个例子的处理代码是启动第二个 PowerShell 实例,在新的实例中执行 Start-Sleep 命令来模拟某些长时间运行的任务。如果您将 Start-Sleep 的参数调整为短于 $maximumRuntimeSeconds 指定的值,那么操作将会在指定的超时值之内完成,而您的脚本将不会结束该进程。

PowerShell 技能连载 - 以管理员身份执行指定的代码

如果您需要以管理员身份运行指定的脚本片段,您可以以管理员身份临时创建第二个 PowerShell 实例,然后在临时的实例中执行特权代码。

这是一段停止 Windows 更新服务的例子。当您以普通用户运行这段代码时,它将自动弹出提权的对话框,然后在一个新的管理员外壳中执行您的代码:

#requires -Version 2

Start-Process -FilePath powershell.exe -Verb runas -ArgumentList 'Stop-Service -Name wuauserv' -WindowStyle Minimized

PowerShell 技能连载 - 查找驱动器号

以下是一个查找保留驱动器号的简单函数:

#requires -Version 3

function Get-DriveLetter
{
    (Get-WmiObject -Class Win32_LogicalDisk).DeviceID
}

要列出所有正在使用的驱动器号,请使用以下代码:

PS> Get-DriveLetter
C:
D:
Y:
Z:

PS>

要查看某个给定的驱动器号是否被保留,可以使用这段代码:

PS> $letters = Get-DriveLetter

PS> $letters -contains 'c:'
True

PS> $letters -contains 'f:'
False

PS>

PowerShell 技能连载 - 快速设置多个环境变量

以下是一种快速(并且永久地)设置一系列环境变量的很棒的方法:

$hashtable = @{
    Name = 'Weltner'
    ID = 12
    Ort = 'Hannover'
    Type = 'Notebook'
    ABC = 123
}

$hashtable.Keys | ForEach-Object {
    $Name = $_
    $Value = $hashtable.$Name
    [Environment]::SetEnvironmentVariable($Name, $Value, "User")
}

只需要在一个哈希表中定义变量。该脚本将为每个键值对创建一个环境变量。将“User”替换为“Machine”,就可以创建系统级别的环境变量。不过这将需要管理员权限。

通过类似的方法,您也可以删除环境变量。只需要将空字符串赋值给哈希表中的值即可。