将所有正在运行的进程写入PowerShell中的文本文件

问题描述 投票:0回答:2

此代码的目的是获取特定文件夹中所有已使用可执行文件的列表。一个月后,我们将删除此列表中没有的任何exe。

我目前使用这个得到了正确的结果:

while ($true) {
    foreach ($process in Get-Process | where {$_.Path -imatch 'ksv'} | select -Unique) {
        $dir = $process | Get-ChildItem;
        New-Object -TypeName PSObject -Property @{
            'Path' = $process.Path;
        } | Out-String | Add-Content -LiteralPath Z:\processList.txt 
     }
     Get-Content Z:\processList.txt | sort | Get-Unique > Z:\uniqueprocesslist.txt
 }

我将摆脱while循环,因为这将最终作为服务运行。

这个问题是它在processlist.txt中创建了一个巨大的列表,我想消除它以节省空间。

我试图提出一个更好的解决方案来扫描文本文件,看看在添加新的进程路径之前是否已经写入了路径。我不确定我做错了什么,但没有写入文本文件

while ($true) {
    foreach ($process in Get-Process | where {$_.Path -imatch 'ksv'} | select -Unique) {
        $dir = $process | Get-ChildItem;
        $progPath = New-Object -TypeName PSObject -Property @{
            'Path' = $process.Path
        }
        $file = Get-Content "Z:\processList.txt"
        $containsLine = $file | %{$_ -match $progPath}
        if ($containsLine -contains $false) {
            Add-Content -LiteralPath Z:\processList.txt
        }
    }
}
powershell
2个回答
1
投票

如果我正确理解您的问题,您希望在文件的特定目录中构建“最近使用的”可执行文件列表,并在每次运行脚本时更新该(唯一)列表。

像这样的东西应该这样做:

$listfile = 'Z:\processlist.txt'

# Build a dictionary from known paths, so that we can check for already known
# paths with an index lookup instead of a linear search over an array.
$list = @{}
if (Test-Path -LiteralPath $listfile) {
    Get-Content $listfile | ForEach-Object {
        $list[$_] = $true
    }
}

# List processes, expand their path, then check if the path contains the
# string "ksv" and isn't already known. Append the results to the list file.
Get-Process |
    Select-Object -Expand Path |
    Sort-Object -Unique |
    Where-Object {$_ -like '*ksv*' -and -not $list.ContainsKey($_)} |
    Add-Content $listfile

Hashtable查找和通配符匹配用于性能原因,因为它们比数组中的线性搜索和正则表达式匹配要快得多。


0
投票
while ($true) {
    $file = Get-Content "Z:\processList.txt"
    $KSVPaths = Get-Process | 
                      Where-Object {$_.Path -imatch 'ksv'} |
                        Select-Object -ExpandProperty Path |
                          Select-Object -Unique
    ForEach ($KSVPath in $KSVPaths) {
         if ($KSVPath -notin $file) {
             Add-Content -Path $file -Value $KSVPath
         }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.