PowerShell 技能连载 - 访问终极 PowerShell 生存指南
您熟悉 PowerShell 生存指南吗?它是终极的 PowerShell 维基页面,包括视频、Module,和您很可能需要的关于 PowerShell 的一切资源。最棒的部分:它是一个开放式维基,所以如果您自己创建了一个 PowerShell 资源,希望让其他人知道它,那么您完全可以编辑 PowerShell 生存指南来让别人知道它。
您熟悉 PowerShell 生存指南吗?它是终极的 PowerShell 维基页面,包括视频、Module,和您很可能需要的关于 PowerShell 的一切资源。最棒的部分:它是一个开放式维基,所以如果您自己创建了一个 PowerShell 资源,希望让其他人知道它,那么您完全可以编辑 PowerShell 生存指南来让别人知道它。
目前最好的字幕下载工具是爱页工作室的 SubManager 字幕管理器。程序通过射手网开放的API自批量动下载电影对应的字幕,省去逐个找字幕的麻烦。其工作原理与射手播放器一致,但有十余项增强。
目前它的最新版是 v2013.7.2,我在使用过程中发现一个问题:
当搜索目录中含有扩展名为空的文件时,程序出现异常:
有关调用实时(JIT)调试而不是此对话框的详细信息,
请参见此消息的结尾。
************** 异常文本 **************
System.ArgumentException: 字符串的长度不能为零。
参数名: oldValue
在 System.String.Replace(String oldValue, String newValue)
在 ShooterDownloader.DownloadForm.PopulateFileList(String dir, String[] fileList)
在 ShooterDownloader.DownloadForm.PopulateFileList(String dir)
在 ShooterDownloader.DownloadForm.PopulateFileList(String dir, String[] fileList)
在 ShooterDownloader.DownloadForm.PopulateFileList(String dir)
在 ShooterDownloader.DownloadForm.PopulateFileList(String dir, String[] fileList)
在 ShooterDownloader.DownloadForm.PopulateFileList(String dir)
在 ShooterDownloader.DownloadForm.PopulateFileList(String dir, String[] fileList)
在 ShooterDownloader.DownloadForm.PopulateFileList(String dir)
在 ShooterDownloader.DownloadForm.PopulateFileList(String dir, String[] fileList)
在 ShooterDownloader.DownloadForm.PopulateFileList(String dir)
在 ShooterDownloader.DownloadForm.PopulateFileList(String dir, String[] fileList)
在 ShooterDownloader.DownloadForm.PopulateFileList(String dir)
在 ShooterDownloader.DownloadForm.txtDir_KeyUp(Object sender, KeyEventArgs e)
在 System.Windows.Forms.Control.OnKeyUp(KeyEventArgs e)
在 System.Windows.Forms.Control.ProcessKeyEventArgs(Message& m)
在 System.Windows.Forms.Control.ProcessKeyMessage(Message& m)
在 System.Windows.Forms.Control.WmKeyChar(Message& m)
在 System.Windows.Forms.Control.WndProc(Message& m)
在 System.Windows.Forms.TextBoxBase.WndProc(Message& m)
在 System.Windows.Forms.TextBox.WndProc(Message& m)
在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
用 Reflector 将 SubManager.exe 反编译,得到它的源代码,定位到 DownloadForm
的 PopulateFileList(String, String[]) : Void
方法。其中只有一行用到 String.Replace()
方法:
if ((File.Exists(info.FullName.Replace(info.Extension, ".srt")) || File.Exists(info.FullName.Replace(info.Extension, ".ass"))) || (File.Exists(info.FullName.Replace(info.Extension, ".ssa")) || File.Exists(info.FullName.Replace(info.Extension, ".smi"))))
把它改为:
if (string.IsNullOrEmpty(info.Extension) || (File.Exists(info.FullName.Replace(info.Extension, ".srt")) || File.Exists(info.FullName.Replace(info.Extension, ".ass"))) || (File.Exists(info.FullName.Replace(info.Extension, ".ssa")) || File.Exists(info.FullName.Replace(info.Extension, ".smi"))))
并重新编译,该错误提示消失了。
我联系了作者 ayeah,他表示将在下一个版本修复。
Get-WmiObject
并未对 WMI 类提供智能感知信息,所以您要么事先知道 WMI 类的名字,要么使用 -List
参数来搜索它。
不过有一个聪明的技巧:Get-CimInstance
命令几乎完成相同的事情,并且它的参数 -ClassName
也接受一个 WMI 类名。而这个参数提供了智能感知支持。
在 PowerShell 3.0 ISE 中进行以下操作:
PS> Get-CimInstance -ClassName Win32_
然后按下 CTRL+SPACE
键来调用智能感知。请观察状态栏提示。由于有几百个 WMI 类名,所以首次尝试的时候,智能感知在获取所有类信息的时候可能会超时。过一段时间,或者您稍微限定以下类名,它就可以正常工作了。
所以只要用 Get-CimInstance
来代替 Get-WmiObject
,然后在智能感知的支持下选择类名,然后将 Cmdlet 和参数改回 Get-WmiObject -Class
即可。
或者,从头到尾都使用 Get-CimInstance
。它返回基本相同价值的信息。但在缺省情况下,它使用 WSMan 协议来进行远程操作,而不是 DCOM。
WMI 可以提供一个系统的很多信息,但是有些时候这些信息太多了。当您查询逻辑磁盘时,您得到的往往不止是物理磁盘。
设置额外的过滤器可以解决此问题。以下这行代码通过设置 DriveType=3
来获取物理驱动器:
PS> Get-WmiObject -Class Win32_LogicalDisk -Filter 'DriveType=3'
DeviceID : C:
DriveType : 3
ProviderName :
FreeSpace : 4468535296
(...)
由于 Get-WmiObject
有一个 -ComputerName
参数,所以您也可以远程获取该信息。如果您想知道有哪些其他的驱动器类型,只需要去掉过滤条件,或者用搜索引擎搜索 "Win32_LogicalDisk DriveType"
。
当您按照上一个技巧进行设置以后,PowerShell 3.0 便可以自动加载 Module。然而,对于某些 Module,该技术没有效果。那些 Cmdlet 仍然只能通过 Import-Module
的方式来导入 Module。
导致它们的原因是由于它们构建的方式。PowerShell 无法检测到这些 Module 导出了哪些 Cmdlet。
然而,有一行简单的命令可以让更多的 Module 自动变得可用:
PS> Get-Module -ListAvailable -Refresh
该 -Refresh
switch 参数告知 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'
如果您希望将 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 图标来打开一个跳转列表并且使用完整的 Administrator 特权来打开 PowerShell 或 ISE 编辑器。
您还可以按住 SHIFT
键并且右键单击跳转列表中的 PowerShell 图标。这将打开另一个快捷菜单,您可以在这里选择一个完全不同的凭据来运行 PowerShell。
并没有针对 ISE 编辑器的这个选项,但是当您以不同的凭据运行了 PowerShell 之后,您可以简单地键入命令“ise
”来以相同的账户运行 ISE 编辑器。
从 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
配合,更为强大。
要在 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
键。帮助窗口将会打开,并显示详细的帮助。