欢迎各位兄弟 发布技术文章
这里的技术是共享的
powershell get-command 过滤
在 PowerShell 中,Get-Command
是一个用于检索有关命令和应用程序信息的 cmdlet。你可以通过管道 (|
) 将 Get-Command
的输出传递给其他 cmdlet 来实现过滤。以下是一些常用的过滤方法:
你可以使用 Where-Object
或其别名 ?
来按名称过滤命令。例如,要查找名称中包含 "Get-" 的命令:
powershell复制代码
Get-Command | Where-Object { $_.Name -like "Get-*" }
Get-Command
的输出对象有一个 CommandType
属性,你可以根据这个属性来过滤命令类型。例如,要查找所有函数:
powershell复制代码
Get-Command -CommandType Function
你可以使用 Module
属性来按模块名称过滤命令。例如,要查找来自 Microsoft.PowerShell.Utility
模块的命令:
powershell复制代码
Get-Command | Where-Object { $_.ModuleName -eq "Microsoft.PowerShell.Utility"}
你可以组合多个条件来进行更复杂的过滤。例如,查找来自 Microsoft.PowerShell.Utility
模块且名称中包含 "Get-" 的函数:
powershell复制代码
Get-Command -CommandType Function | Where-Object { $_.ModuleName -eq "Microsoft.PowerShell.Utility" -and $_.Name -like "Get-*" }
Select-Object
自定义输出如果你只需要命令的某些属性,可以使用 Select-Object
来选择这些属性。例如,只显示命令名称和模块名称:
powershell复制代码
Get-Command | Select-Object Name, ModuleName
虽然 Get-Command
本身不支持直接按参数过滤,但你可以通过获取命令的详细信息并检查其参数来实现。例如,查找包含特定参数的命令:
powershell复制代码
Get-Command | ForEach-Object {
$command = $_
$parameters = $command.Parameters.Keys if ($parameters -contains "SomeParameter") {
$_
}
}
假设你想查找所有包含动词 Get
的命令:
powershell复制代码
Get-Command | Where-Object { $_.Verb -eq "Get" }
请注意,Verb
属性是在 PowerShell 5.0 及更高版本中引入的。在旧版本中,你可能需要使用名称匹配来模拟类似的效果。
通过这些方法,你可以灵活地过滤 Get-Command
的输出,以找到你需要的命令信息。
Get-Command | Where-Object { $_.Name -like "Get-*" } 详解
在 PowerShell 中,Get-Command
是一个强大的 cmdlet,用于检索有关命令、函数、别名、脚本和应用程序的信息。当你将 Get-Command
的输出通过管道 (|
) 传递给 Where-Object
cmdlet 时,你可以根据特定的条件过滤这些命令。下面是对命令 Get-Command | Where-Object { $_.Name -like "Get-*" }
的详细解释:
powershell复制代码Get-Command | Where-Object { $_.Name -like "Get-*" }
Get-Command:检索当前 PowerShell 会话中可用的所有命令。
|:管道符号,用于将前一个命令的输出作为下一个命令的输入。
Where-Object:筛选符合特定条件的对象。在这个例子中,它用于筛选 Get-Command
的输出。
**{ _.Name -like "Get-*" }**:`Where-Object` 的脚本块,定义了筛选条件。` 代表当前正在处理的命令对象,
$.Name访问该对象的
Name 属性。
-like "Get-*"是一个比较操作,用于检查
Name` 属性是否以 "Get-" 开头。
**.Name∗∗:‘ 是一个自动变量,代表当前正在通过管道传递的对象。在这个例子中,每个对象都是一个命令。
$.Name访问该命令的
Name` 属性。
-like "Get-*":-like
是 PowerShell 中的比较运算符,用于执行简单的模式匹配。"Get-*"
是一个通配符模式,其中 *
表示任意数量的任意字符。因此,这个条件匹配任何以 "Get-" 开头的字符串。
该命令的输出将是所有以 "Get-" 开头的命令的列表。这些命令通常用于检索或获取有关系统状态、配置或数据的信息。例如,你可能会看到 Get-Process
、Get-Service
、Get-EventLog
等命令。
假设你的 PowerShell 会话中有许多命令,该命令可能会返回类似以下的输出:
plaintext复制代码CommandType Name Version Source ----------- ---- ------- ------ Cmdlet Get-Acl 3.1.0.0 Microsoft.PowerShell.Security Cmdlet Get-Alias 7.1.0.0 Microsoft.PowerShell.Core Cmdlet Get-AppLockerFileInformation 2.0.0.0 AppLocker ...(其他命令)
输出的具体内容取决于你的 PowerShell 会话中可用的命令。
如果你只关心命令的名称,可以使用 Select-Object Name
来仅显示名称属性。
-like
运算符区分大小写,但你可以使用 -ilike
(在 PowerShell 的某些版本中可能需要加载 CaseInsensitive
模块或使用正则表达式)来执行不区分大小写的比较。
通过理解这个命令的结构和筛选条件,你可以更有效地使用 PowerShell 来查找和管理命令。
$_ 表示什么 美元符下划线
在 PowerShell 中,$_
是一个自动变量,它代表当前正在管道 (|
) 中处理的对象。当你在 PowerShell 管道中使用 Where-Object
、ForEach-Object
、Group-Object
等 cmdlet 时,$_
就变得特别有用,因为它允许你直接访问或操作正在被处理的每个对象。
这里有几个使用 $_
的例子:
Where-Object
在 Where-Object
中,$_
表示当前正在评估的对象。例如,要过滤出长度大于 5 的字符串数组中的元素:
powershell复制代码$strings = "apple", "banana", "cherry", "date" $strings | Where-Object { $_.Length -gt 5 }
这里,$_
代表 $strings
数组中的每个字符串。
ForEach-Object
在 ForEach-Object
中,$_
也表示当前正在处理的对象。例如,要打印每个字符串的长度:
powershell复制代码$strings | ForEach-Object { Write-Output $_.Length }
或者更简洁地:
powershell复制代码$strings | ForEach-Object { $_.Length }
虽然 $_
在 Where-Object
和 ForEach-Object
中最常见,但它也可以在其他接受管道输入的 cmdlet 中使用。例如,在 Sort-Object
中,你可以根据对象的某个属性进行排序:
powershell复制代码$objects = @( @{Name="John"; Age=30}, @{Name="Jane"; Age=25}, @{Name="Doe"; Age=35} ) $objects | Sort-Object -Property Age
虽然这个例子中没有直接使用 $_
,但 Sort-Object
内部确实在处理每个对象时使用了类似的概念。
如果你需要在脚本块中多次引用当前对象,给 $_
分配一个别名也是一个好习惯,这样可以提高代码的可读性:
powershell复制代码$strings | ForEach-Object { $item = $_ # 现在可以使用 $item 而不是 $_ Write-Output "$item has length $($item.Length)" }
但是,在大多数情况下,直接使用 $_
是更简洁和标准的做法。
在 PowerShell 中,Get-Command
cmdlet 本身并没有直接的 -Filter
参数用于过滤命令。但是,Get-Command
确实有几个参数可以帮助你缩小命令搜索的范围,比如 -CommandType
、-Module
、-Name
和 -Verb
/-Noun
(在 PowerShell 5.0 及更高版本中可用)。