我制作了一个PowerShell脚本,通过不包含已知流程的电子邮件报告每小时/每日当前运行流程。
我现在想要使用添加到列表中的新进程更容易更新。
以下是当前脚本的示例:
$Yday = (Get-Date).AddDays(-1)
$pros = Get-Process | Where {($_.StartTime -GT $Yday -and $_.ProcessName -notmatch "chrome|outlook|powershell")}
$pros
的输出将包含过去24小时内开始的流程结果减去流程chrome,outlook和powershell。
我想实现:
一个名为“Known_Processes.txt”的文件,其中包含
等进程列表chrome outlook powershell
然后使用以下脚本创建用于在where语句中作为过滤器传递的相同文本字符串。
$Yday = (Get-Date).AddDays(-1)
[string]$Known_Processes = (Get-Content -Path C:\PS\known_processes.txt | Out-String).Replace("`n", "|").TrimEnd("|")
$pros = Get-Process | Where {($_.StartTime -GT $Yday -and $_.ProcessName -notmatch $Known_Processes)}
此输出将显示所有进程,包括我尝试过滤的进程,即使变量$known_processes
与“chrome | outlook | powershell”的值相同。
我尝试过搜索,唯一可以使用正则表达式的方法就是使用正则表达式。虽然我可以做到这一点,但我担心其他没有PowerShell知识的管理员在尝试更新where
语句时可能会出错。作为where
,他们可以更容易地将进程名称插入列表中的文本文件中。
答案 0 :(得分:1)
# Making a file called Known_Processes.txt
@'
chrome
outlook
powershell
'@ | Set-Content Known_Processes.txt
# Main action performed
$Yesterday = (Get-Date).AddDays(-1)
$Known_Processes = Get-Content Known_Processes.txt
Get-Process | Where-Object -Property ProcessName -NotIn -Value $Known_Processes | Where-Object -Property StartTime -GT -Value $Yesterday
# Removing file for cleanup
Remove-Item Known_Processes.txt
这会得到以下输出:
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
145 11 6676 11004 0.13 10120 0 audiodg
106 10 5240 7000 0.08 4680 1 conhost
731 70 181276 213872 391.86 9472 1 Google Play Music Desktop Player
348 37 52764 59612 322.28 10408 1 Google Play Music Desktop Player
174 13 4944 12980 0.06 11028 1 Google Play Music Desktop Player
966 77 62064 107048 357.63 13040 1 Google Play Music Desktop Player
180 13 2088 764 0.19 2164 0 GoogleUpdate
112 8 1468 6524 0.03 11452 1 LPlatSvc
231 12 3364 9460 0.06 9872 0 MpCmdRun
1174 44 170640 137568 19.34 13104 1 mstsc
364 18 8612 17488 0.61 1456 0 policyHost
1177 105 309768 367660 128.64 13920 1 powershell_ise
994 68 72328 66172 3.69 1760 1 SearchUI
93 7 1668 6396 0.03 2120 0 svchost
1307 125 393556 381216 1,529.28 5172 1 Teams
1132 63 80672 95644 175.88 7316 1 Teams
331 25 38372 38020 0.78 13072 1 Teams
376 25 71736 69744 24.83 13260 1 Teams
312 24 36872 34264 0.48 14120 1 Teams
98 7 1636 6508 0.02 13628 0 TrustedInstaller
511 34 42220 63268 1.20 13044 1 WINWORD
答案 1 :(得分:1)
你可以很好地做到这一点:
$pros = Get-Process | ? {( $_.StartTime -GT $(Get-Date).AddDays(-1) -and $_.ProcessName -notmatch $([String]::Join("|",$(Get-Content -Path C:\PS\known_processes.txt))) )}
或者如果它更容易阅读,基本上反映了你原来的想法:
$Yday = (Get-Date).AddDays(-1)
$Excludes = [String]::Join("|",$(Get-Content C:\PS\known_processes.txt))
$pros = Get-Process | ? {( $_.StartTime -GT $Yday -and $_.ProcessName -notmatch $Excludes )}
两者的输出示例:
PS C:\Admin> Get-Process | Where {( $_.StartTime -GT $Yday -and $_.ProcessName -notmatch $Excludes )}
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
21 5 2192 3168 44 0.00 9272 cmd
54 7 198000 202140 251 2.78 4184 conhost
53 7 5352 9176 63 0.12 5204 conhost
100 9 2540 7100 49 0.00 15952 msiexec
868 35 44628 58828 210 3.39 12156 mstsc
913 35 202060 202688 351 17.18 14464 mstsc
90 8 2320 6616 52 0.03 15168 taskeng
194 21 36852 28332 274 0.20 5912 Teams
247 24 37268 56412 796 0.44 7328 Teams
863 62 70624 109184 916 9.72 9816 Teams
246 24 39908 56496 790 0.41 11816 Teams
971 98 299508 316804 1759 32.82 13144 Teams
PS C:\Admin> Get-Process | Where {( $_.StartTime -GT $(Get-Date).AddDays(-1) -and $_.ProcessName -notmatch $([String]::Join("|",$(Get-Content C:\PS\known_processes.txt))) )}
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
21 5 2192 3168 44 0.00 9272 cmd
54 7 198000 202144 251 2.81 4184 conhost
53 7 5352 9176 63 0.12 5204 conhost
100 9 2512 7084 48 0.00 15952 msiexec
868 35 44628 58828 210 3.39 12156 mstsc
913 35 202060 202688 351 17.19 14464 mstsc
194 21 36852 28332 274 0.20 5912 Teams
247 24 37268 56412 796 0.44 7328 Teams
869 63 70664 109208 917 9.80 9816 Teams
246 24 39908 56496 790 0.41 11816 Teams
971 98 299064 315856 1761 33.13 13144 Teams
在以下评论中与您聊天后,这是您原来的"替换"代码工作通过替换`r`n而不是`n,如下面的注释中所示,Join是更好的选择,因为它旨在通过替换EOL字符来连接字符串。
$Yday = (Get-Date).AddDays(-1)
[string]$Known_Processes = (Get-Content -Path known_processes.txt | Out-String).Replace("`r`n", "|").TrimEnd("|")
$pros = Get-Process | Where {( $_.StartTime -GT $Yday -and $_.ProcessName -NotMatch $Known_Processes )}
希望有所帮助:)
注意:此版本符合Powershell 2.x至5.x标准,因为它使用" NotMatch"而不是" NotIn"," -NotIn"原来不是支持的操作数。
答案 2 :(得分:0)
我认为更好的方法是迭代已知流程列表:
result = @()
$pcs = get-process
$known_process = Get-Content -Path C:\PS\known_processes.txt
$known_process | Foreach-Object {
$result += $pcs.Where({ $_.ProcessName -ne $_ })
}
答案 3 :(得分:0)
试试这个
$list=get-content c:\temp\known_processes.txt
$Yday = (Get-Date).AddDays(-1)
Get-Process | Where {($_.StartTime -GT $Yday -and $_.ProcessName -notin $list)}