在Where语句中使用变量

时间:2017-12-15 15:24:05

标签: powershell filtering

我制作了一个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,他们可以更容易地将进程名称插入列表中的文本文件中。

4 个答案:

答案 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)}