如何在启动Web服务器后继续执行Powershell脚本?

时间:2015-04-07 18:56:35

标签: powershell

我有一个调用另外两个脚本的脚本。

  

script0.ps1

Invoke-Expression C:\script1.ps1
Invoke-Expression C:\script2.ps1

第一个脚本启动Web服务器:

  

script1.ps1

./activate anaconda_env     
cd C:\webserver
python api_server.py

第二个脚本启动ngrok服务:

  

script2.ps1

./activate anaconda_env
cd c:\ngrok
./ngrok -subdomain=mysd 8000

问题是script0.ps1只执行script1.ps1。此时Web服务器开始在控制台中运行,因此不执行script0.ps1的第二个命令。

如何编写脚本以便执行这两个命令?或者,如何编写一个脚本来执行所有命令,但是在两个独立的控制台中?

最终结果应该是: 1)在具有激活的anaconda环境的控制台中运行的web服务器 2)在具有激活的anaconda环境的控制台中运行的ngrok服务

3 个答案:

答案 0 :(得分:0)

更改Script1.ps1以将python作为作业启动:

./activate anaconda_env     
 cd C:\webserver
 Invoke-Command -ScriptBlock {.\python.exe api_server.py} -AsJob -ComputerName .

我没有您正在使用的特定脚本,因此我使用3.43附带的turtle.py对此进行了测试,似乎可以正常运行。

答案 1 :(得分:0)

您无需使用Invoke-Expression从其他脚本运行Powershell脚本。就像你在命令行上一样运行它

c:\script1.ps1
c:\script2.ps1

现在,如果script1.ps1启动一个不退出的进程,它将暂停脚本中下一个语句的执行,从而也阻止第二个脚本运行。 在大多数情况下,这种顺序执行正是您想要的。

在您的情况下,您可以使用Start-Process异步启动脚本。 所以你的主要脚本就像:

start-process c:\script1.ps1
start-process c:\script2.ps1

Start-Process基本上启动了一个新的命令shell来运行语句。查看文档以获取更多信息。您可以使用一系列参数来调整这种情况。

答案 2 :(得分:0)

要不让invoke-expression关闭脚本,可以将输出传递给Out-Null。您上面的代码如下所示:

Invoke-Expression C:\script1.ps1 | Out-Null
Invoke-Expression C:\script2.ps1 | Out-Null