2017-12-15 10 views
1

PowerShellスクリプトを使用して、現在実行中の毎日のプロセスを、既知のプロセスを除いた電子メールで報告しました。Whereステートメントで変数を使用する

これで、リストに追加された新しいプロセスでこれを簡単に更新できます。以下は

現在のスクリプトの例です:$pros

$Yday = (Get-Date).AddDays(-1) 
$pros = Get-Process | Where {($_.StartTime -GT $Yday -and $_.ProcessName -notmatch "chrome|outlook|powershell")} 

出力は、プロセスの結果が含まれます、最後の24時間のマイナスプロセスクロム、見通しおよびPowerShellで始まり​​ました。

私が達成したいと思います:

「Known_Processes.txt」に使用されるテキストの同じ文字列を作成するには、次のスクリプトを使用して、その後

 
chrome 
outlook 
powershell 

のようなプロセスのリストを含むと呼ばれるファイルwhereステートメントのフィルタとして渡します。 「|見通し| PowerShellのクローム」

$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が同じ値でありながらも、フィルタリングしようとしていますプロセスを含め、すべてのプロセスが表示されます。

私は検索しようとしましたが、これを動作させるための唯一の方法は正規表現を使用することです。私がこれを行うことができる間に、whereステートメントを更新しようとすると、PowerShellの知識を持たない他の管理者が間違いを犯す可能性があります。 whereとして、リスト内のテキストファイルにプロセス名を挿入する方が簡単です。

答えて

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 
+0

ああ、私の悪い、取得プロセスは、配列を受け入れる、これは間違いなく良いです – 4c74356b41

+0

こんにちはショーン 私はこれが出力として知られているプロセスをフィルタリングしているので、これと反対のことをしていると思います。どこでget-processの出力から既知のプロセスを差し引いて出力したいのですか? ありがとう – CraftyB

+0

@CraftyB確かに。 –

0

私はより良いアプローチが知られているプロセスのリストを反復処理することだと思う:

result = @() 
$pcs = get-process 
$known_process = Get-Content -Path C:\PS\known_processes.txt 
$known_process | Foreach-Object { 
    $result += $pcs.Where({ $_.ProcessName -ne $_ }) 
} 
+0

Ehhhを試してみてください、それはオペアンプを使用して、重複で終わるし、それらをフィルタリングする必要が言及しているように、これは、有用ではない –

+0

すべての非除外プロセスを追加するために複数回起こっています。 PowerShellではどこが非常に強力です。別の考え方は、日付で変数にフィルタリングし、その変数をフィルタリングするためにwhereを使用することですが、それは複数回クエリを再実行せずにprocsのいくつかのビューを取得する場合にのみ有効です。 –

0

をあなたのようにきれいにこれを行うことができます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 

をここで以下のコメントであなたとおしゃべりした後、元の「置換」のコードは、交換することによって動作しています以下のコメントのように、 `n 'の代わりに` r`nを使うと、EOL文字を置き換えて文字列を結合することを意図しているので、Joinは本当に良い選択肢です。助け:)

$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)} 

希望

注:それは代わりに "NotIn" の "NotMatch" を使用していますので、このバージョンは、5.xの通過に準拠しPowerShellの2.xのある "-NotIn" もともとはなかったですサポートされているオペランド。

+0

きれいに行われました。 私はまだPowerShellの基本を学んでいます。 これは好奇心からどのように/どのように動作するのですか?また、なぜ新しい行をジョイン方法と同じパイプで置き換えるのと同じではないのですか? 私は結合方法を知らなかったので、これを尋ねます。 まだ十分な議員はいないが、私は投票を行うだろう。 ありがとう – CraftyB

+0

「参加」は、EOL(End of Line)文字を削除して文字列を結合する際のニュアンスに特化しています。大部分の目的と目的のために、ソースファイルがWindowsからのものであるため、同じ結果に対して '\' r \ 'n'を使用するように元のコードを修正することができました。ソースファイルがUNIXの場合、通常は '\' n'が使用されますが、通常は '\' n'が使用されます。 -Joinはこれを処理するために特別に作成されたもので、EOLを解析して結果を一致させるプロセスから推測を外します。 –

+0

スタック交換がなぜコード・インジケータとして扱われているのか分かりませんが、今のところ私はそれを正しくエスケープする方法を考えていません。それを理解しました。良いバックバックスラッシュ:) –

0

この

$list=get-content c:\temp\known_processes.txt 
$Yday = (Get-Date).AddDays(-1) 
Get-Process | Where {($_.StartTime -GT $Yday -and $_.ProcessName -notin $list)} 
関連する問題