PowerShell 技能连载 - HTML 编码
有一个 .NET 的静态方法可以对一段文本进行 HTML 编码,例如如果您希望在 HTML 输出中正常显示一段文本:
1 | PS> [System.Web.HttpUtility]::HtmlEncode('Österreich heißt so.') |
有一个 .NET 的静态方法可以对一段文本进行 HTML 编码,例如如果您希望在 HTML 输出中正常显示一段文本:
1 | PS> [System.Web.HttpUtility]::HtmlEncode('Österreich heißt so.') |
这行代码将在您的配置文件中查找所有 Word 文档:
1 | Get-ChildItem -Path $home -Filter *.doc* -Recurse |
If you’d like, you can easily print them all. Here is how:
如果需要,可以将它们全部打印出来。以下是具体方法:
1 | Get-ChildItem -Path $home -Filter *.doc* -Recurse | |
它最重要的部分是 -Wait
参数:如果缺少了它,PowerShell 将会同时启动多个 Word 的实例,并行打印所有文档。这将耗尽您系统的资源。使用 -Wait
参数以后,PowerShell 将等待前一个 Word 打印完之后再启动下一个实例。
在德国,有一些公开的媒体数据库,里面有公共站点发布的电视内容。只需要用一小段 PowerShell 代码就可以解析 JSON 数据,在一个列表中显示电视节目,并使你能够选择某项来下载。
请注意包含下载链接的 JSON 文件非常大,所以需要过一段时间才能显示出视频列表。
1 | #requires -Version 3.0 |
Whenever PowerShell records an error, it wraps it in an Error Record object. Here is a function that takes such an error record and extracts the useful information:
当 PowerShell 记录一个错误时,它将错误信息包装在一个 Error Record 对象中。以下是一个处理这种错误记录并解析有用信息的函数:
1 | #requires -Version 3.0 |
如果您想知道最后的错误信息是什么,请试试这个:
1 | PS C:\> $error | Get-ErrorDetail | Out-GridView |
或者,您现在可以简单地命令一个 cmdlet 缓存它的错误信息,并在晚些时候处理它们。这个例子递归地在 Windows 文件夹中搜索 PowerShell 脚本。您可以获取结果,以及搜索时发生的所有错误的详细信息:
1 | $files = Get-ChildItem -Path c:\Windows -Filter *.ps1 -Recurse -ErrorAction SilentlyContinue -ErrorVariable myErrors |
有些时候在 PowerShell 中只需要几行代码就可以创造出很有用的支持工具。以下是一个显示所有禁用的 AD 用户的例子。您可以选择一个(或按住 CTRL 键选择多个),然后点击 OK,这些用户将会被启用:
1 | #requires -Version 3.0 -Modules ActiveDirectory |
有些时候从一个指定的 AD 用户读取所有属性到一个哈希表中十分有用。通过这种方法,您可以编辑他们,并使用 Set-ADUser
和它的 -Add
或 -Replace
参数将他们应用于另一个用户账户。
以下是将所有 AD 用户属性读到一个哈希表中的方法:
1 | #requires -Version 3.0 -Modules ActiveDirectory |
请注意 $blacklist
的使用:这个列表可以包含任何希望排除的属性名。
在前一个技能中我们演示了 Get-FolderStructureWithPermission
如何以结构化的形式记录并创建一个包含所有嵌套文件夹的清单,包含它们各自的 NTFS 安全设置。结果可以保存到一个变量中,或用 Export-Csv
序列化后保存到磁盘中。
今天我们演示第二部分:当您拥有一个指定文件夹结构的信息之后,可以使用这个 Set-FolderStructureWithPermission
。它输入一个要克隆其结构的文件夹路径,加上通过 Get-FolderStructureWithPermission
获得的结构信息:
1 | #requires -RunAsAdministrator |
由于设置 NTFS 权限的需要,这个函数需要管理员特权才能运行。
免责声明:这里呈现的所有代码仅供学习使用。由于我们没有投入大量精力去测试它,所以没有任何保障,而且它并不是生产准备就绪的代码。您有责任对这段代码进行测试,并决定它是否完美符合您的需要。
一个典型的用例是克隆一个现有的文件夹结构:
1 | # clone user profile |
有些时候您需要重新创建一个嵌套的文件夹结构,并且希望克隆 NTFS 权限。今天我们我们专注第一个步骤:记录一个已有的文件夹结构,包括 SDDL 格式的 NTFS 权限。
我们可以用 Get-FolderStructureWithPermission
函数实现这个任务。它输入一个已存在文件夹的路径,并返回所有子文件夹,包括 SDDL 格式的 NTFS 权限:
1 | function Get-FolderStructureWithPermission |
您可以将结果通过管道输出到 Out-GridView
,或将它保存到一个变量,或用 Export-Csv
将它写到磁盘中。
1 | PS C:\> Get-FolderStructureWithPermission -Path $home | Format-List |
免责声明:这里呈现的所有代码仅供学习使用。由于我们没有投入大量精力去测试它,所以没有任何保障,而且它并不是生产准备就绪的代码。您有责任对这段代码进行测试,并决定它是否完美符合您的需要。
在 PowerShell 中运行控制台应用程序的迷你系列的第三部分中,有一个小课题:如何独立于 PowerShell 运行一个控制台应用程序,并且当它执行完成后得到通知,并且获取它的 exit code?
以下是实现方法:以下代码在一个独立(隐藏)的窗口中运行 ping.exe。PowerShell 继续运行并且可以执行任何其它操作。在这个例子中,它在 ping.exe 正忙于 ping 一个主机名的同时打出一系列“点”号。
当 exe 执行完成时,这段代码能获取进程的 ExitCode 信息:
1 | $hostname = 'powershellmagazine.com' |
当您直接启动一个控制台应用程序时,PowerShell 会返回它的 exit code(也叫做 Error Level),并存储在 $LASTEXITCODE
变量中。然而,如何获取通过 Start-Process
启动的控制台应用程序的 exit code 呢?
以下是方法:
1 | $hostname = 'powershellmagazine.com' |