有没有一种方法使powershell可以获取控制台应用程序的输出并将其保存在文本文件中?

25 浏览
0 Comments

有没有一种方法使powershell可以获取控制台应用程序的输出并将其保存在文本文件中?

我有一个Java程序,我想要从PowerShell脚本中作为后台进程启动它,就像在Linux上运行守护进程一样。PowerShell脚本需要做几件事情:

  1. 以独立的后台进程方式运行程序,即父窗口可以关闭而进程继续运行。
  2. 将程序的标准输出和标准错误重定向到文件。
  3. 将后台进程的进程ID保存到文件中,以便稍后可以由另一个脚本终止。

我在Linux上有一个shell脚本可以这样启动程序:

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

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

输出重定向也有问题,因为似乎只有在同一个窗口中运行进程时才可以重定向输出和错误流(例如使用-NoNewWindow选项)。

在PowerShell中是否有可能实现这样的功能?

0
0 Comments

在PowerShell中获取控制台应用程序的输出并将其保存在文本文件中的解决方法:

可以使用以下两种方法来实现:

方法一:使用Start-Job

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'

在PowerShell中,可以使用Start-Job来运行脚本块,脚本块可以包含任何类型的PowerShell代码,包括对外部命令的调用。使用Start-Process时,可以将输出流重定向到指定的文件中。需要注意的是,使用Start-Process启动的进程会在一个新的窗口中运行,如果想同时重定向输出流,则需要使用Start-Job。

根据测试结果,使用Start-Process启动的进程可以在关闭父命令窗口后继续运行。如果在Java程序中添加了一些延时操作或输出语句,即使关闭了命令窗口,Java程序也会继续运行并将输出写入相应的文件中。

根据反馈,有用户遇到了在使用Start-Process时出现一个空白窗口的问题。可以尝试使用-WindowStyle参数来隐藏窗口,例如使用-WindowStyle Hidden的方式。如果仍然存在问题,建议升级PowerShell版本或使用Start-Job来实现。

以上就是在PowerShell中获取控制台应用程序输出并保存到文本文件的解决方法。

0
0 Comments

在这个问题中,用户想要通过PowerShell运行一个控制台应用程序并将其输出保存在文本文件中。问题的原因是用户之前尝试使用"java"命令而不是"javaw"命令来调用控制台应用程序,所以需要找到正确的命令来解决这个问题。

解决方法是使用以下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" 
}

通过上述解决方法,用户可以成功启动控制台应用程序并将其输出保存到指定的文本文件中。

0
0 Comments

可以使用任务计划程序来解决这个问题。定义一个任务并将其设置为没有任何触发器。这样可以让你简单地"运行"(手动触发)任务。

你可以使用ScheduledTasks Powershell模块来设置和/或触发计划任务,或者你可以使用图形界面。

谢谢。我没有意识到可以通过PowerShell来安排任务,所以我会研究一下。任务可以设置为一次性任务而不是持久性或定期任务吗?

0