PowerShell 技能连载 - 限制文本的长度(第一部分)
如果您想将一个文本的长度限制在某一个长度,以下是一个简单的方法:
1 | $text = 'this is a long text' |
这段代码首先对文本填充,以防它比最大长度还短,然后使用 Substring()
裁剪掉多余的文本。
如果您想将一个文本的长度限制在某一个长度,以下是一个简单的方法:
1 | $text = 'this is a long text' |
这段代码首先对文本填充,以防它比最大长度还短,然后使用 Substring()
裁剪掉多余的文本。
这一行代码能够列出所有本地用户配置文件中的桌面——请确保以管理员身份运行这行代码才能查看其他人的配置文件:
1 | Resolve-Path -Path C:\users\*\Desktop -ErrorAction SilentlyContinue |
如果您只想获得配置文件中包含 “Desktop” 文件夹的用户名,请用以下代码:
1 | Resolve-Path -Path C:\users\*\Desktop -ErrorAction SilentlyContinue | |
这段代码获取路径并用反斜杠将它们分割,创建一个路径元素的数组。下标 -2 是指倒数第二个元素,即用户名。
从 PowerShell 4 开始,当您不想使用管道的时候,可以使用 Where()
和 ForEach()
方法来代替 Where-Object
和 ForEach-Object
。
所以如果您已经将所有数据加载到一个变量中,那么非流式操作会更高效:
1 | $Services = Get-Service |
要节约资源,最有效地方法仍然是使用流式管道,而不是用变量:
1 | Get-Service | Where-Object { $_.Status -eq 'Running' } |
请注意 Where-Object
和 .Where()
使用不同的数组类型,所以它们的输出技术上是不同的:
1 | PS C:\> (1..19 | Where-Object { $_ -gt 10 }).GetType().FullName |
以下是一个用内置的 CSV 处理器生成对象数组的代码实例:
1 | $csv = @' |
如果一个脚本需要一个静态的服务器、连接数据或其他信息的列表,这种方式会很有用。
PowerShell 使用了大量所谓类型加速器来简化过长的 .NET 类型名。例如 “System.DirectoryServices.DirectoryEntry” 可以简化为 “ADSI”。
当您需要查询一个类型的完整名称时,您可以获取到实际的完整 .NET 类型名:
1 | PS C:\> [ADSI].FullName |
以下代码在 PowerShell 中输出所有的内置 .NET 类型加速器:
1 | [PSObject].Assembly.GetType("System.Management.Automation.TypeAccelerators")::get | |
除了显式的类型加速器之外,还有一个 PowerShell 内置的规则:在 System
命名空间中的类型加速器可以省略命名空间。所以以下的表达完全一致:
1 | PS C:\> [int].FullName |
内部的系统功能往往十分有用,但请确保真正了解它们的功能。
一个特别常见的系统方法叫做 GetTempFileName()
,能够创建临时文件名。而当您进一步观察的时候,您会发现它不仅创建临时文件名,而且还创建了临时文件:
1 | $file = [System.IO.Path]::GetTempFileName() |
所以如果在脚本中只是使用这个方法来创建临时文件名的话,会留下一大堆孤立的文件。
在 PowerShell 中,一切都是用对象描述。以下是一个检查任意对象并将它的成员以文本的方式复制到剪贴板的单行代码:
1 | "Hello" | |
只需要将 “Hello” 替换成任何变量或命令,然后看看复制了什么到剪贴板中。您可以将信息粘贴到文本编辑器或文字处理器中,并将它打印出来或转成 PDF 备用。
在 PowerShell 5 中,对枚举的新支持特性使得处理比特位比您在前面的 PowerShell 技能中看到的简单得多。现在设置或清除比特位不再需要冗长的逻辑操作符。
我们先定义一个枚举类型,这样更好管理十进制数:
1 | #requires -Version 5 |
现在,十进制数的比特位可以很容易地转化为 GardenPartyItem 的列表:
1 | PS C:\> [GardenPartyItems]11 |
注意:将十进制数转换为枚举型时,请确保枚举型中定义了所有的比特。如果十进制数太大,包含枚举型之外的比特时,转换会失败。
要增加一个新的标志位,请试试以下的代码:
1 | PS C:\> $flags |
要移除一个标志位,请试试以下代码:
1 | PS C:\> $flags |
然而,实际上并没有看起来这么简单。当移除一个已有的标志位,没有问题。但移除一个没有置位的标志位,会把比特值搞乱:
1 | PS C:\> $flags |
所以 PowerShell 在自动处理二进制算法方面明显还不够智能。要安全地使用该功能,您还是要用二进制操作符。要移除标志位,请使用 -band
和 -bnot
:
1 | PS C:\> $flags |
要设置标志位,请使用 -bor
:
1 | PS C:\> $flags |
在所有这些操作中,实际上是在操作一个十进制数:
1 | PS C:\> [Int]$flags |
相当棒,对吧?
对十进制数设置比特标志位不是很难,但是不够直观。以下是一个快速的新方法,演示如何设置或取消一个数字中特定的比特:
1 | $decimal = 6254 |
结果演示了代码做了什么。ToString()
从右到左显示比特,所以第 0 比特是在最右边。在第二行和第三行,设置了两个独立的比特位,而并不影响其它位。在最后一行中,清除了一个比特位。
1 | 1100001101110 |
在前一个技能中我们演示了如何使用 PowerShell 5 新的枚举特性来解析bite标志位,甚至可以独立地检测每个标志位。
如果您无法使用 PowerShell 5,在早期的 PowerShell 版本中,仍然可以使用这个技术只需要通过 C# 代码来定义枚举即可:
1 | # this is the decimal we want to decipher |
如您所见,从十进制数转换到新的枚举类型使用正常而且非常简单:
1 | PS C:\> [BitFlags]6625 |