我有一个调用另外两个脚本的脚本。
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服务
答案 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