PowerShell 技能连载 - 使用通配符确定数组是否包含值
当您想了解一个数组是否包含某个指定的元素,PowerShell 提供了 -contains 操作符。然而这个操作符不支持通配符,所以您只能使用精确匹配。
以下是一个帮助您使用通配符过滤数组元素的解决方法:
1 | $a = 'Hanover', 'Hamburg', 'Vienna', 'Zurich' |
PowerShell 技能连载 - 使用通配符确定数组是否包含值
当您想了解一个数组是否包含某个指定的元素,PowerShell 提供了 -contains 操作符。然而这个操作符不支持通配符,所以您只能使用精确匹配。
以下是一个帮助您使用通配符过滤数组元素的解决方法:
1 | $a = 'Hanover', 'Hamburg', 'Vienna', 'Zurich' |
LDAP 过滤器是一个快速和强大的从 Active Directory 中获取信息的方法。然而,LDAP 过滤器使用的是一个很底层的日期和时间格式。它基本上是一个很大的整形数。幸运的是 PowerShell 包含多种将实际 DateTime 对象转换为这些数字,以及相反操作的方法。
以下是一个使用 ActiveDirectory 模块中 Get-ADUser 方法来查找所有近期更改了密码的用户的示例代码。如果您没有这个 module,请从 Microsoft 下载免费的 RSAT 工具。
1 | # find all AD Users who changed their password in the last 5 days |
PowerShell 技能连载 - 使用 PowerShell 参数验证器
PowerShell 的函数参数支持 ValidateScript 属性,可以关联到一段 PowerShell 代码。当该参数接收到一个值时,该代码将会被调用,并且返回 $true 或 $false。如果该代码返回 $false 则该参数被拒绝。
以下是一个仅接受 Windows 文件夹中存在的文件的文件名的例子:
1 | function Get-File |
以下是使用效果:
1 | PS C:\> Get-File -File explorer.exe |
当转换数据(将它转换为不同的数据类型)时,PowerShell 支持两种不同的方式方式。
以下是一个例子:
1 | [DateTime]'12.1.2017' |
两行代码都将一个字符串转为一个 DateTime 对象。第一行代码代表强制转换。它可能成功也有可能失败,并且它总是使用语言中性的格式(US 格式),所以它应为一个 月-日-年 格式。
第二行代表“尝试转换”:该转换要么成功要么静默地返回 $null。该转换遵循当前的区域设置,所以如果您在一个德文系统众运行这段代码,这段文字被解释成 日-月-年 格式。
可以通过调用操作符,例如 “&“、”.“ 或调用 Invoke() 方法调用在一个脚本块中的代码。
一个区别是当有多于一个结果时的输出:调用操作符返回一个扁平的对象数组,而 Invoke() 返回一个集合:
1 | $code = { Get-Process } |
通过 Invoke() 方法返回的集合拥有额外的方法,例如 RemoveAt() 和 Insert(),它们能够帮您修改结果数据,能高效地插入或删除元素。
您可以手动将一个 cmdlet 的返回值手动转为一个 ArrayList:
1 | $arrayList = [Collections.ArrayList]@(Get-Process) |
PowerShell 技能连载 - 不带动词运行 Cmdlet
这是从 PowerShell 1.0 开始就具有的一个特性:调用动词为 “get” 的 cmdlet 可以省略动词。所以调用 “Get-Service“ 时您可以仅执行 “Service“调用 “Get-Date“ 时可以仅执行 “Date“。
以下不是别名,甚至 PowerShell 引擎并不知道为什么它能工作。请试试这些代码:
1 | PS> Date |
使用这个快捷方式的前提是没有冲突的命令或语法元素。这也是为什么您可以运行 “Get-Process“,但不能运行 “Process“ 的原因:”Process“ 是 PowerShell 语言中的一个保留关键字。
PowerShell 技能连载 - 限制文本的长度(第二部分)
以下是确保一段文本不超过指定长度的另一种策略。和前一个技能不同的是,当文本长度小于最大长度时,这段代码不会补齐空格:
1 | $text = 'this' |
关键点在 Min() 函数,它决定了两个值中小的哪个。
PowerShell 技能连载 - 限制文本的长度(第一部分)
如果您想将一个文本的长度限制在某一个长度,以下是一个简单的方法:
1 | $text = 'this is a long text' |
这段代码首先对文本填充,以防它比最大长度还短,然后使用 Substring() 裁剪掉多余的文本。
PowerShell 技能连载 - 查找所有含桌面的配置文件
这一行代码能够列出所有本地用户配置文件中的桌面——请确保以管理员身份运行这行代码才能查看其他人的配置文件:
1 | Resolve-Path -Path C:\users\*\Desktop -ErrorAction SilentlyContinue |
如果您只想获得配置文件中包含 “Desktop” 文件夹的用户名,请用以下代码:
1 | Resolve-Path -Path C:\users\*\Desktop -ErrorAction SilentlyContinue | |
这段代码获取路径并用反斜杠将它们分割,创建一个路径元素的数组。下标 -2 是指倒数第二个元素,即用户名。
PowerShell 技能连载 - Where-Object 和 .Where()
从 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 |