在powershell中添加包含空格的进程名



我已经列出了所有使用handle.exe访问一个目录的进程。

function Get-FileHandle ($HPath){
$handles = handle $HPath 
}

输出如下:

nhandle v4.11 - Handle viewer版权所有(C) 1997-2017Russinovich Sysinternals - www.sysinternals.com

jdbc -direct.exe pid: 12716类型:文件838:C:WindowsSystem32drivers等

Creative Cloud.exe pid: 4280类型:文件9D0:C:WindowsSystem32drivers等

Adobe CEF Helper.exe pid: 12916类型:文件494:C:WindowsSystem32drivers等

brave.exe pid: 2920类型:文件690:C:WindowsSystem32drivers等

brave.exe pid: 13828类型:文件344:C:WindowsSystem32drivers等

现在我试图只列出进程名而不列出所有其他值。我的代码是:

foreach ($handle in $gethandle) {
$handle.Split(" ") | ?{$_ -like "*exe"}
}

输出为:

jabra-direct.exe

Cloud.exe

Helper.exe

brave.exe

brave.exe

一切正常,直到进程名包含一个空格。应该是creative cloud.exe,而不是cloud.exe。

我怎样才能使它工作?所以,创造性的云。exe将显示,而不仅仅是云。exe ?

这是使用Select-Stringcmdlet的一种方法。

$handles = handle $HPath    # assuming handle.exe can be found via PATH env var
$selected = $handles | Select-String -Pattern '.*?(?= +pid:)'
$processNames = $selected.Matches.Value    # array of process names

Select-String行使用正则表达式从输出中提取进程名:

  • .*?-一切到以下模式(尽可能少地修剪尾部空白)
  • (?=-启动正向正向模式
    • +-多一个空格字符
    • pid:-文字"pid:">
  • )-结束正向向前看模式

正向前看确保我们只找到" pid:"后面的子字符串,而不包括" pid:"在结果中。

表达式$selected.Matches.Value是:

的快捷方式
$processNames = @()
foreach( $sel in $selected ) {
foreach( $match in $sel.Matches ) {
$processNames += $match.Value
}
}

当PowerShell无法在数组对象中找到属性时,它会自动搜索该属性的每个数组成员,并返回一个包含所有已找到值的数组。这称为成员枚举。

尝试下面的代码并根据需要进行调整。Regex是(.*)(?=pid:)pid:s(d+)stype:s([^d]+)s([dABCDEF]+):s(.*),它结合了正向前看和捕获组。然后使用自动属性$Matches来提取捕获组值。

$output = @"
Nthandle v4.11 - Handle viewer Copyright (C) 1997-2017 Mark Russinovich Sysinternals - www.sysinternals.com
jabra-direct.exe pid: 12716 type: File 838: C:WindowsSystem32driversetc
Creative Cloud.exe pid: 4280 type: File 9D0: C:WindowsSystem32driversetc
Adobe CEF Helper.exe pid: 12916 type: File 494: C:WindowsSystem32driversetc
brave.exe pid: 2920 type: File 690: C:WindowsSystem32driversetc
brave.exe pid: 13828 type: File 344: C:WindowsSystem32driversetc
"@
$output = $output.Split("`r`n")
$output | ForEach-Object {
if ($_ -match "(.*)(?=pid:)pid:s(d+)stype:s([^d]+)s([dABCDEF]+):s(.*)") {
$props = [ordered]@{
Name = $Matches[1]
PID = $Matches[2]
Type = $Matches[3]
Handle = $Matches[4]
Path = $Matches[5]
}
New-Object -TypeName PSObject -Property $props
}
} | Format-Table -AutoSize

相关内容

  • 没有找到相关文章

最新更新