在PowerShell中启动一个独立的后台进程

我有一个Java程序,我想从PowerShell脚本作为后台进程启动,类似于守护进程在Linux上运行的方式。 PowerShell脚本需要做几件事情:

  1. 在后台运行该程序作为一个单独的和分离的进程,这意味着父窗口可以closures,进程继续运行。
  2. 将程序的标准输出和标准错误redirect到文件。
  3. 将后台进程的PID保存到一个文件,以便以后可以用另一个脚本来终止。

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

$ java -jar MyProgram.jar >console.out 2>console.err & 

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

输出redirect也很麻烦,因为输出和错误stream似乎只能在正在同一窗口中运行的进程中redirect(例如,使用-NoNewWindow )。

在PowerShell中这种事情是可能的吗?

Solutions Collecting From Web of "在PowerShell中启动一个独立的后台进程"

使用这个工作:

 Start-Job -ScriptBlock { & java -jar MyProgram.jar >console.out 2>console.err } 

另一种选择是Start-Process

 Start-Process java -ArgumentList '-jar', 'MyProgram.jar' ` -RedirectStandardOutput '.\console.out' -RedirectStandardError '.\console.err' 

这是一个旧的帖子,但因为我认为它可以帮助分享。 它调用'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" 

你可以把它变成一个小功能,然后是一个别名,以便在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" } 

考虑使用这个任务调度器。 定义一个任务,并设置它没有任何触发器。 这将允许您只需“运行”(手动触发)任务。

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