1

如何将所有与某个进程名称匹配的 Get-Process 进程一一传递给另一个 PowerShell 脚本?

伪代码

for each process in matchingprocesses:
  myScript(process)

计划使用 Set-WorkingSetToMin 脚本:https ://www.powershellgallery.com/packages/PoshInternals/1.0/Content/Set-WorkingSetToMin.ps1

这很好用,因为只有一个 notepad++ 进程:

get-process notepad++ | Set-WorkingSetToMin 

但是对于 VS Code,这只获取第一个代码进程并忽略其余部分:

get-process code | Set-WorkingSetToMin

如何将匹配某个名称的每个进程通过管道传输到 powershell 脚本?

替代方法是修改 PoshInternals 脚本以接受多个进程:

# Dont run Set-WorkingSet on sqlservr.exe, store.exe and similar processes
# Todo: Check process name and filter
# Example - get-process notepad | Set-WorkingSetToMin 
Function Set-WorkingSetToMin {
    [CmdletBinding()]
    param(
    [Parameter(ValueFromPipeline=$True, Mandatory=$true)]
    [System.Diagnostics.Process] $Process
    )

if ($Process -ne $Null)
{
    $handle = $Process.Handle
    $from = ($process.WorkingSet/1MB) 
    $to = [PoshInternals.Kernel32]::SetProcessWorkingSetSize($handle,-1,-1) | Out-Null
    Write-Output "Trimming Working Set Values from: $from"

} #End of If
} # End of Function

在没有额外变量的情况下在一行中回答:

foreach ($process in Get-Process myprocessname) { Set-WorkingSetToMin ($process) }
4

1 回答 1

2

您可以添加一个 where 子句以仅提取您想要的进程,然后将其设置为 Set-WorkingSetToMin。下面是一个示例,但根据需要进行调整以准确提取您正在寻找的内容。

get-process | where {$_.ProcessName -like "*code*"} | Set-WorkingSetToMin

更新:我明白你在说什么,问题不在于发送的进程集,而在于它们一旦到达那里是如何处理的。为了解决这个问题,您可以设置一个等于进程集的变量,然后遍历它们,每次调用 cmdlet。像这样的东西:

$processes = get-process | where {$_.ProcessName -like "code"} | Set-WorkingSetToMin

foreach ($process in $processes)
{
    Set-WorkingSetToMin ($process)
}

回答感谢兰登的帮助:foreach ($process in Get-Process myprocessname) { Set-WorkingSetToMin ($process) }

于 2018-06-20T15:18:06.887 回答