【问题标题】:Start process in PowerShell, dehydrate it's data and detach from it在 PowerShell 中启动进程,对其数据进行脱水并从中分离
【发布时间】:2015-08-14 19:19:19
【问题描述】:

我正在尝试从 TeamCity PowerShell 构建步骤远程启动 NodeJS 包。

目前,启动流程的部分如下所示:

$npm = "C:\Program Files\nodejs\node.exe"
$params = $pathToStart

$proc = Start-Process -FilePath $npm -ArgumentList $params -Passthru
$proc | Export-Clixml -Path $fullProcessHandlePath

$pathToStart 确实保存了我的包入口点的路径。当我使用 -Wait 运行它时,有效地导致我的 PS 脚本永远不会结束,我可以看到节点包已启动并且正在正确执行。但是,如果我让脚本运行到

$proc | Export-Clixml -Path $fullProcessHandlePath

然后退出,我的节点进程也会终止。

我需要调用 Export-Clixml 来保存新创建的进程句柄信息,以便我以后可以从另一个脚本中销毁它。

如何保留 Export-Clixml,但从 ps 脚本中分离并让 node.exe 继续工作?

【问题讨论】:

    标签: node.js windows powershell start-process


    【解决方案1】:

    我最终使用node-windows 包拥有node.js 代码来为我的应用程序创建一个Windows 服务。我知道这是一种不同的事情,我不会将其标记为答案,尽管我知道即使使用 Start-Job 也无法让 node.exe 保持活力,可能会节省一些人的时间并带来更可靠的解决方案。

    【讨论】:

      【解决方案2】:

      我建议使用 Start-Job cmdlet 而不是 Start-Process,因为它允许您将 PowerShell 控制台与命令运行分离。

      $npm = "C:\Program Files\nodejs\node.exe"
      $params = $pathToStart
      
      Start-Job -FilePath $npm -ArgumentList $params
      

      至于提取进程信息,我能想到的最好方法是通过按时间排序运行获取最新的节点进程,这将与进程启动的毫秒数一样细。

      Get-Process notepad | Sort-Object starttime | Select-Object -Last 1 | Export-Clixml -Path $fullProcessHandlePath
      

      【讨论】:

      • 谢谢。唯一的问题是 Start-Job 告诉我应该指定另一个 ps1 脚本是 -FilePath 的值。如果我通过代码块执行,我最终会在其中调用 Start-Process。
      • 我花了一个小时尝试从 $scriptBlock 运行节点,该节点是通过 Start-Job 启动的,它充当黑盒。我运行它,传递参数,什么也没有。当我监视调用 Invoke-Command 以在机器上执行这一切的 PowerShell 用户跨越的进程时,我看到它创建了一个 powershell 进程、另外两个 conhost 和其他东西,但甚至从未尝试运行 node.exe。我怀疑我的脚本块中的代码永远不会执行。
      • 您的示例有一个确切的错误:FilePath 参数的值必须是 Windows PowerShell 脚本文件。输入文件扩展名为 .ps1 的文件的路径,然后重试该命令。
      猜你喜欢
      • 2014-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-27
      • 2020-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多