我有一个 Windows 服务(Bamboo 集成服务器),它将批处理文件作为该脚本的子进程(构建作业)运行。在该批处理文件中,我希望能够启动一个进程(我们称之为 workerprocess.exe)并让该进程在后台运行。这一切都很好,我使用过:
start "title" /B workerprocess.exe
一切都很好。问题是这会延迟构建作业的完成。因此,批处理脚本完成,但由于 workerprocess.exe 子进程,服务 (Bamboo) 不知道它已完成:它仍在等待 workerprocess.exe(并显示其输出)。
我查看了 start 命令的文档,但没有找到任何可以满足我要求的内容。我看到这个问题但它实际上也没有帮助——服务仍然等待该过程完成。
因此我总结一下:如何从批处理脚本运行新进程,以便它完全分离并且不会阻止等待该批处理脚本完成的任何事情。
答案1
你有没有尝试过隐藏启动 (HSTART)? (费用20美元)
我个人使用它来运行每小时的批处理作业,并且隐藏窗口。他们还提到,您可以按参数顺序运行命令(或者默认情况下,我假设)异步运行。我不知道这会如何影响您对 CPU、内存或磁盘的争用……但该软件还为您提供了在执行操作之前等待一段时间的选项。
答案2
@echo off
echo self minimizing
call getCmdPid.bat
call windowMode.bat -pid %errorlevel% -mode hidden
echo --other commands--
pause
所有链接的脚本都可以下载并以您认为方便的任何名称保存。
- 这快运解决方案 - 作为参数仅接受命令及其参数。
使用示例:
call hidder.bat myBat.bat myexe.exe
call myexe.exe
- 任务列表- 再次只接受两个参数 - 命令和参数。还检查它是否以提升的权限启动,如果可能的话,使用 WEVTUTIL 命令获取进程的 PID。
使用示例:
call SCHPhidden.bat "cmd /c myBat.bat" "argument"
- ‘WScript.Shell’- 该脚本是“WScript.Shell”的完整包装器,并且可以通过命令行选项设置每个可能的选项。它是 jscript/batch 混合体,可以作为 bat 调用。
使用示例(有关更多信息,请使用‘-h’打印帮助):
call ShellRunJS.bat "notepad.exe" -style 0 -wait no
- 'Win32_ProcessStartup'- 再次完整的包装器,所有选项都可以通过命令行参数访问。这次它是 WSF/batch 混合体,带有一些 Jscript 和一些 VBScript 代码片段 - 但它返回已启动进程的 PID。如果进程 ID 未隐藏,则可以使用一些选项(如 X/Y 坐标)。
示例用法(有关更多信息,请使用“-h”打印帮助)。如果可执行文件/脚本不在以下位置,则需要其完整路径%path%
:
call win32process.bat "notepad" -arguments "/A openFile.txt" -showWindow 0 -title "notepad"
- 这 。NET 解决方案。ProcessStartInfo 选项的大多数选项都用到了(但是最后我太累了,没有把所有选项都包括进去):
使用示例(有关更多信息,请使用‘-h’打印帮助):
call ProcessStartJS.bat "notepad" -arguments "/A openFile.txt" -style Hidden -directory "." -title "notepad" -priority Normal