欢迎各位兄弟 发布技术文章
这里的技术是共享的
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 及更高版本中可用)。