PowerShell 技能连载 - 检查 Cmdlet 可用性和脚本兼容性(第 2 部分)

并不是所有的 PowerShell cmdlet 都随着 PowerShell 发行。许多 cmdlet 是随着第三方模块发布。当安装某些软件时会同时安装这些模块,或者需要使用特定的 Windows 版本。

在前一部分中我们处理了一个脚本并且读出这个脚本所使用的所有外部命令。我们用这个函数合并了找到的所有外部命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
function Get-ExternalCommand
{
param
(
[Parameter(Mandatory)][string]
$Path
)
function Get-ContainedCommand
{
param
(
[Parameter(Mandatory)][string]
$Path,

[string][ValidateSet('FunctionDefinition','Command')]
$ItemType
)

$Token = $Err = $null
$ast = [Management.Automation.Language.Parser]::ParseFile($Path, [ref] $Token, [ref] $Err)

$ast.FindAll({ $args[0].GetType().Name -eq "${ItemType}Ast" }, $true)

}


$functionNames = Get-ContainedCommand $Path -ItemType FunctionDefinition |
Select-Object -ExpandProperty Name

$commands = Get-ContainedCommand $Path -ItemType Command
$commands | Where-Object {
$commandName = $_.CommandElements[0].Extent.Text
$commandName -notin $functionNames
} |
ForEach-Object { $_.GetCommandName() } |
Sort-Object -Unique
}

您可以向这个函数传入任何 PowerShell 脚本路径并且得到这个脚本使用的所有外部命令(只需要确保在 $path 中传入了一个脚本的合法路径):

1
2
3
4
5
6
7
8
9
10
11
PS C:\> Get-ExternalCommand -Path $Path
ConvertFrom-StringData
Get-Acl
Get-ItemProperty
Get-Service
Get-WmiObject
New-Object
out-default
Test-Path
Where-Object
write-host

PowerShell 技能连载 - 检查 Cmdlet 可用性和脚本兼容性(第 2 部分)

http://blog.vichamp.com/2019/03/13/checking-cmdlet-availability-and-script-compatibility-part-2/

作者

吴波

发布于

2019-03-13

更新于

2022-07-06

许可协议

评论