在PowerShell中启动分离的后台进程

Dav*_*ave 14 windows powershell

我有一个Java程序,我想从PowerShell脚本作为后台进程启动,类似于守护程序在Linux上运行的方式.PowerShell脚本需要执行以下操作:

  1. 在后台运行程序作为单独的分离进程,这意味着可以关闭父窗口并继续运行进程.
  2. 将程序的标准输出和标准错误重定向到文件.
  3. 将后台进程的PID保存到文件中,以便稍后由另一个脚本终止.

我在Linux上有一个shell脚本,它启动程序如下:

$ java -jar MyProgram.jar >console.out 2>console.err &
Run Code Online (Sandbox Code Playgroud)

我希望使用PowerShell脚本在Windows上复制相同的行为.我尝试过使用Start-Process各种选项组合,以及创建System.Diagnostics.ProcessStartInfoSystem.Diagnostics.Process对象,但到目前为止我没有运气.PowerShell作为后台进程启动程序,但是当启动PowerShell会话的DOS窗口关闭时,程序突然终止.我希望它在后台启动并独立于启动它的命令窗口.

输出重定向也很麻烦,因为输出和错误流似乎只能在同一窗口中运行的过程中重定向(例如,使用-NoNewWindow).

PowerShell中有可能出现这种情况吗?

Ans*_*ers 18

使用作业:

Start-Job -ScriptBlock {
  & java -jar MyProgram.jar >console.out 2>console.err
}
Run Code Online (Sandbox Code Playgroud)

另一种选择是Start-Process:

Start-Process java -ArgumentList '-jar', 'MyProgram.jar' `
  -RedirectStandardOutput '.\console.out' -RedirectStandardError '.\console.err'
Run Code Online (Sandbox Code Playgroud)

  • 它是作为一个独立的进程启动的,这意味着您可以关闭命令窗口并且该进程在后台继续运行?当我使用`Start-Process`尝试它时,在关闭父命令窗口后,我无法使进程保持不变. (4认同)

小智 5

考虑为此使用任务调度程序。定义一个任务并在没有任何触发器的情况下设置它。这将允许您简单地“运行”(手动触发)任务。

您可以使用 ScheduledTasks powershell 模块设置和/或触发计划任务,也可以使用 GUI。


Ern*_* M. 5

这是一篇旧文章,但由于我运行良好,因此认为它可能有助于分享。调用“java”而不是“javaw”可能是您的问题。我自己使用 JEdit java 程序通过 powershell 运行它来启动它。

#Requires -Version 3.0
$MyDriveRoot = (Get-Location).Drive.Root
$JEditDir = $($mydriveroot + "jEdit") ;# Should be C:\jEdit or wherever you want. JEdit is a sub-directory.
$jEdit = $($JEditDir + "\jedit.jar" )
$jEditSettings = $($JEditDir + "\settings")
$JEditLogs = $($JEditDir + "\logs")

Start-Process -FilePath javaw -ArgumentList ( '-jar',"$jEdit", '-settings="$JEditSettings"' ) -RedirectStandardOutput "$JEditLogs\console.out" -RedirectStandardError "$JEditLogs\console.err"
Run Code Online (Sandbox Code Playgroud)

您可以将其转换为一个小函数,然后是一个别名,以便在 Powershell 中轻松启动。

If ( ( Test-Path $jedit) ) {
    Function Start-JEdit() {
        Start-Process -FilePath javaw -ArgumentList ( '-jar',"$jEdit", '-settings="$($mydriveroot + "jEdit\settings")"' ) -RedirectStandardOutput "$JEditLogs\console.out" -RedirectStandardError "$JEditLogs\console.err"
    }
New-Alias -Name jedit  -Force Start-JEdit  -Description "Start JEdit programmers text editor" 
}
Run Code Online (Sandbox Code Playgroud)