【问题标题】:PowerShell script that runs in background changing specific process priority to low whenever it is ran在后台运行的 PowerShell 脚本在运行时将特定进程的优先级更改为低
【发布时间】:2014-01-08 16:34:11
【问题描述】:

我正在尝试通过我们的组策略部署一个脚本,该脚本将在后台运行并监视名为“3dsmax.exe”的进程。每次启动此过程时,我都想确保它的优先级设置为“低”。

我对 Powershell 的理解极其有限。 我尝试使用不同的论坛组合以下内容,但这似乎不起作用,我相信这将在第一次出现后终止,这是不可取的。我使用“calc.exe”作为测试进程。

#requires -version 2.0

Register-WmiEvent -Class win32_ProcessStartTrace -SourceIdentifier processStarted



$prog = 'calc.exe'
$newEvent = Wait-Event -SourceIdentifier processStarted

If ($progs -match $newEvent.SourceEventArgs.NewEvent.ProcessName)
{ 
    $prog = Get-Process -Name calc
    $prog.PriorityClass = [System.Diagnostics.ProcessPriorityClass]::Low
}

任何帮助都会很棒:)

【问题讨论】:

  • 添加一个片段以确定 processID (PID),这样您就可以确保只影响正确的实例。或者,循环遍历“calc.exe”的所有实例,并且仅在 processpriority 尚未为低时重新启动。
  • 我的get-process命令也只能在没有.exe的情况下工作$prog = Get-Process -Name calc
  • 这些机器运行的是什么操作系统版本?
  • 客户端运行 Windows 7 Professional x64
  • 我编辑了我的代码以添加 $prog = 'calc.exe' 以便 If 语句实际上与 'calc.exe' 进行比较。我相信在一个给定的时间可能只有一个该过程的实例运行(据我所知)。但是,它可以在一天内运行多次,这就是我希望脚本在后台连续运行的原因。话虽如此,它不起作用,需要做更多阅读:)

标签: powershell powershell-2.0 powershell-1.0


【解决方案1】:

这是解决这个问题的好方法吗? 它似乎有效,但我不确定这是进入上述问题的无限循环的好方法。

while($true)
{
    $Query = "select * from __instanceCreationEvent within 1 where targetInstance isa 'win32_Process' AND TargetInstance.Name = 'calc.exe'"
        $Eventwatcher = New-Object management.managementEventWatcher $Query

        $Event = $Eventwatcher.waitForNextEvent()

        $prog = Get-Process -Name calc
        $prog.PriorityClass = [System.Diagnostics.ProcessPriorityClass]::Idle
}

【讨论】:

    【解决方案2】:

    这是另一种方法。我测试时无法识别“::Low”,必须使用::Idle。编辑:添加 foreach ? |循环以在多个实例的情况下抑制错误。在脚本开头添加了空闲循环,以在打开时捕获任何预先存在的进程。

    $prog = Get-Process -Name calc | ?{$_.PriorityClass = [System.Diagnostics.ProcessPriorityClass]::Idle}
    
        while($true)
        {
            $Query = "select * from __instanceCreationEvent within 1 where targetInstance isa 'win32_Process' AND TargetInstance.Name = 'calc.exe'"
                $Eventwatcher = New-Object management.managementEventWatcher $Query
    
                $Event = $Eventwatcher.waitForNextEvent()
    
                $prog = Get-Process -Name calc | ?{$_.PriorityClass = [System.Diagnostics.ProcessPriorityClass]::Idle}
        }
    

    这里有一个小 .vbs 片段,可以不可见地打开应用程序,因此您的用户不会看到 powershell 窗口。

    command = "powershell.exe -nologo -command C:\IDLER.ps1"
    set shell = CreateObject("WScript.Shell")
    shell.Run command,0
    

    【讨论】:

    • 需要在它周围包裹一个循环,以便它在一天中连续运行。
    • 非常感谢!这似乎有效!您如何建议设置循环以使此后台脚本优雅地运行并尊重其他进程。我昨天读到,如果持续运行,脚本本身可能会开始干扰其他正在运行的进程。
    • 废话,如果我手动运行它在工作站上工作,当我通过组策略(机器级别)部署它时它将无法工作。一定是有什么东西阻碍了它
    • 从登录脚本尝试。
    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 2016-02-15
    • 2016-03-30
    • 1970-01-01
    • 2014-10-29
    相关资源
    最近更新 更多