PowerShell 技能连载 - 改进版的自动加载 Module

当您按照上一个技巧进行设置以后,PowerShell 3.0 便可以自动加载 Module。然而,对于某些 Module,该技术没有效果。那些 Cmdlet 仍然只能通过 Import-Module 的方式来导入 Module。

导致它们的原因是由于它们构建的方式。PowerShell 无法检测到这些 Module 导出了哪些 Cmdlet。

然而,有一行简单的命令可以让更多的 Module 自动变得可用:

PS> Get-Module -ListAvailable -Refresh

-Refresh switch 参数告知 PowerShell 完整地遍历所有的 Module 并且生成或刷新内部的命令缓存。

PowerShell 技能连载 - 自动加载 Module

从 PowerShell 3.0 开始,PowerShell 具备了能够智能识别哪些 Cmdlet 是由哪个扩展 Module 导出的特性。所以您再也不需要知道 Module 的名称并且(用 Import-Module 手动导入它)。与之相反,自动完成和智能感知特性将为所有安装在标准 Module 文件夹中的每一个命令提供建议。以下是列出这些标准文件夹的方法:

PS> $env:PSModulePath -split ';'
C:\Users\Victor\Documents\WindowsPowerShell\Modules
C:\Program Files\WindowsPowerShell\Modules
C:\Windows\system32\WindowsPowerShell\v1.0\Modules\

这些标准文件夹也许不一定相同,您可以根据需要增加更多的文件夹到环境变量中,甚至将 Module 存放在 USB 闪存盘或外置驱动器中。以下命令将把 USB 驱动器的路径增加到您的模块列表中,这样在该文件夹中的所有 Module 也将会被自动加载:

PS> $env:PSModulePath += ';g:\mypersonalmodules'

PowerShell 技能连载 - 安装 Windows Server 2012 桌面体验

如果您希望将 Windows Server 2012 (或 Windows Server 2008 R2)作为工作站机器使用并且使它看起来像 Windows 8(包括在文件浏览器中刻录 ISO 文件,以及个性化您的桌面和其它设置),您所需要做的只是添加桌面体验功能。以下是用 PowerShell 实现的方法:

Add-WindowsFeature -Name Desktop-Experience

在 PowerShell 2.0 中,您首先需要手动导入合适的 module:

Import-Module ServerManager

PowerShell 技能连载 - 以不同用户运行 PowerShell

当您将 PowerShell 固定到任务栏后,您可以右键单击固定的 PowerShell 图标来打开一个跳转列表并且使用完整的 Administrator 特权来打开 PowerShell 或 ISE 编辑器。

您还可以按住 SHIFT 键并且右键单击跳转列表中的 PowerShell 图标。这将打开另一个快捷菜单,您可以在这里选择一个完全不同的凭据来运行 PowerShell。

并没有针对 ISE 编辑器的这个选项,但是当您以不同的凭据运行了 PowerShell 之后,您可以简单地键入命令“ise”来以相同的账户运行 ISE 编辑器。

PowerShell 技能连载 - 监测日志文件

从 PowerShell 3.0 开始,实时监测基于文本的日志文件变得很容易。试试以下代码:

$Path = "$home\Desktop\testfile.txt"

'Test' | Out-File "$home\Desktop\testfile.txt"
notepad $Path

Get-Content -Path $Path -Tail 0 -Wait | Out-GridView -Title $Path

这段代码将在桌面上创建一个文本文件,然后在记事本中打开它。然后 PowerShell 将开始监视文件的变化。一旦您向记事本窗口键入新的文本并保存,则变化的部分会呈现在 PowerShell 的网格视图中。

要监视另一个基于文本的日志文件,只需要改变路径参数即可。由于 PowerShell 在监视文件的状态下处于阻塞状态,您可能需要在另一个 PowerShell 实例中执行新的代码。

译者注:Get-Content -Tail 的效果和 Linux 下的 tail -f 命令的执行效果一致。但 PowerShell 是面向 .NET 对象的,可以利用管道和其它命令,例如 Out-GridView 配合,更为强大。

快速生成树形结构的纯文本

今天帮朋友整理一些材料,需要为这些材料整理一个目录。之前有研究过一些方案,例如:

这些方案有一个共性:麻烦。也就是无法像手头的工具一样拿来就用。于是发掘了一番,发现 tree 这个 dos 时代的命令刚好能满足需要。该命令的帮助如下:

以图形显示驱动器或路径的文件夹结构。

TREE [drive:][path] [/F] [/A]

   /F   显示每个文件夹中文件的名称。
   /A   使用 ASCII 字符,而不使用扩展字符。

我们可以用以下命令将 D:\work 下的结构输出到 output.txt 文本文件:

TREE "D:\work" /F /A > output.txt

然后用记事本之类的文本编辑器对它进行简单的编辑,就可以达到目的。

还可以拓展一下思路:在撰写文章的时候,常常需要描述一个有层次的结构(可以是心得体会之类的,不仅限于描述一系列文件)。此时可以在硬盘里创建一个临时目录,在里面创建一些文件夹和文件,用资源管理器拖拽调整目录结构,然后用上述命令导出一个目录文件,就可以快速地用于文档的撰写了。请不要徒手编辑这样的文本,因为那样很愚蠢,调整起来也相当费功夫。

命令执行效果参考:

卷 os 的文件夹 PATH 列表
卷序列号为 0000002C 000E:BD6F
C:.
|   HaxLogs.log
|   setmockup.log
|   WEVTUTIL.exe
|
+---adt-bundle-windows-x86
|   |   SDK Manager.exe
|   |
|   +---android-ndk-r9
|   |   |   documentation.html
|   |   |   GNUmakefile
...
|   |   |   README.TXT
|   |   |   RELEASE.TXT
|   |   |
|   |   +---build
|   |   |   +---awk
|   |   |   |       check-awk.awk
|   |   |   |       extract-debuggable.awk

PowerShell 技能连载 - 按 F1 跳转到 PowerShell 帮助主题

要在 PowerShell 3.0 ISE 编辑器中获得 PowerShell 所有类型的操作符帮助信息,首先列出关于操作符的所有帮助主题:

help operators

您将会见到一个类似这样的列表:

PS> help operators

Name                              Category  Module                    Synopsis
----                              --------  ------                    --------
about_Arithmetic_Operators        HelpFile                            SHORT DESCRIPTION
about_Assignment_Operators        HelpFile                            SHORT DESCRIPTION
about_Comparison_Operators        HelpFile                            SHORT DESCRIPTION
about_Logical_Operators           HelpFile                            SHORT DESCRIPTION
about_Operators                   HelpFile                            SHORT DESCRIPTION
about_Type_Operators              HelpFile                            SHORT DESCRIPTION

如果您没有看见这个列表,您也许需要先下载 PowerShell 帮助文档。请通过 Update-Help 来查看方法!

然后,单击其中的任意一个主题,然后按下 F1 键。帮助窗口将会打开,并显示详细的帮助。

PowerShell 技能连载 - 键盘技巧

在 PowerShell ISE 4.0 控制台窗格中,按住 CTRL 键,然后按 向上 键,可以将光标从命令行中移到结果区域中。

PowerShell 技能连载 - 查找缺少邮箱地址的 Active Directory 用户

LDAP 查询的功能非常强大,可以帮助查找缺少信息的账户。

这段代码将返回所有带邮箱地址的 Active Directory 用户:

$searcher = [ADSISearcher]"(&(sAMAccountType=$(0x30000000))(mail=*))"
$searcher.FindAll() |
  ForEach-Object { $_.GetDirectoryEntry() } |
  Select-Object -Property sAMAccountName, name, mail

如果您想查询相反的内容,请通过“!”号进行相反的查询。以下代码可以返回所有缺少邮箱地址的 Active Directory 用户:

$searcher = [ADSISearcher]"(&(sAMAccountType=$(0x30000000))(!(mail=*)))"
$searcher.FindAll() |
  ForEach-Object { $_.GetDirectoryEntry() } |
  Select-Object -Property sAMAccountName, name, mail

用 PowerShell 脚本获取天气实况

只要两行命令,就可以“轻松”地获取实时天气预报:

(curl http://61.4.185.48:81/g/ -UseBasicParsing).Content -cmatch 'var id=(\d+);' | Out-Null
irm "http://www.weather.com.cn/data/sk/$($matches[1]).html" | select -exp weatherinfo

使用效果:

PS >(curl http://61.4.185.48:81/g/ -UseBasicParsing).Content -cmatch 'var id=(\d+);' | Out-Null
PS >irm "http://www.weather.com.cn/data/sk/$($matches[1]).html" | select -exp weatherinfo


city    : 福州
cityid  : 101230101
temp    : 15
WD      : 北风
WS      : 2级
SD      : 79%
WSE     : 2
time    : 10:20
isRadar : 1
Radar   : JC_RADAR_AZ9591_JB

您还可以把第二行改为以下形式,获取更猛的数据:

irm "http://m.weather.com.cn/data/$($matches[1]).html" | select -exp weatherinfo

或:

irm "http://www.weather.com.cn/data/cityinfo/$($matches[1]).html" | select -exp weatherinfo

源代码下载

顺便透露一下,高富帅一般不这么看天气预报哦!