我已經用 handle.exe 列出了訪問一個目錄的所有行程。
function Get-FileHandle ($HPath){
$handles = handle $HPath
}
輸出看起來像:
Nthandle v4.11 - 處理查看器 著作權所有 (C) 1997-2017 Mark Russinovich Sysinternals - www.sysinternals.com
jabra-direct.exe pid: 12716 型別: 檔案 838: C:\Windows\System32\drivers\etc
Creative Cloud.exe pid:4280 型別:檔案 9D0:C:\Windows\System32\drivers\etc
Adobe CEF Helper.exe pid:12916 型別:檔案 494:C:\Windows\System32\drivers\etc
勇敢的.exe pid: 2920 型別: 檔案 690: C:\Windows\System32\drivers\etc
勇敢的.exe pid: 13828 型別: 檔案 344: C:\Windows\System32\drivers\etc
現在我試圖只列出行程名而不列出所有其他值。我擁有的代碼是:
foreach ($handle in $gethandle) {
$handle.Split(" ") | ?{$_ -like "*exe"}
}
輸出是:
jabra-direct.exe
云.exe
幫助程式
勇敢者.exe
勇敢者.exe
一切都很好,直到 processname 包含一個空格。它應該是 Creative cloud.exe 而不是 cloud.exe。
我怎樣才能讓它作業?以便顯示創意 cloud.exe 而不僅僅是 cloud.exe ?
uj5u.com熱心網友回復:
這是使用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 在作為陣列的物件上找不到屬性時,它會自動搜索每個陣列成員以查找該屬性并回傳一個包含所有找到的值的陣列。這稱為成員列舉。
uj5u.com熱心網友回復:
嘗試以下代碼并在必要時進行調整。正則運算式(.*)(?=pid:)pid:\s(\d )\stype:\s([^\d] )\s([\dABCDEF] ):\s(.*)結合了積極的前瞻和捕獲組。然后只需使用 auto 屬性$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:\Windows\System32\drivers\etc
Creative Cloud.exe pid: 4280 type: File 9D0: C:\Windows\System32\drivers\etc
Adobe CEF Helper.exe pid: 12916 type: File 494: C:\Windows\System32\drivers\etc
brave.exe pid: 2920 type: File 690: C:\Windows\System32\drivers\etc
brave.exe pid: 13828 type: File 344: C:\Windows\System32\drivers\etc
"@
$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
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/338134.html
