首页 > 解决方案 > 如何让 PowerShell 执行脚本中的所有行?(而不是在 dotnet 上休息一下?)

问题描述

我有一个 PowerShell 版本 5.1.19041.610 脚本,它大致执行以下操作

Do Command 1

Do Command 2

dotnet run "..\MyApiProject\API.csproj" --no-build

Do Command 4

它工作正常,直到dotnet run劫持会话并输出:

Now listening on: http://localhost:5000
Now listening on: https://localhost:5001
Application started. Press Ctrl+C to shut down.

脚本就停在那里。我需要它来执行命令 4。如何让 PowerShell 启动 dotnet 并继续执行下一个命令?

标签: powershellpowershell-5.1

解决方案


您有两个选项可以防止同步 dotnet run ...命令阻塞您的脚本。

  • 在新窗口中异步启动dotnet run ...命令(仅适用于 Windows),使用:Start-Process
Start-Process dotnet 'run "..\MyApiProject\API.csproj" --no-build'
  • 在后台作业中不可见地运行dotnet run ...命令,使用:[1]Start-Job
Start-Job { $using:PWD | Set-Location; dotnet run ..\MyApiProject\API.csproj --no-build }
  • 请注意,PowerShell (Core) 7+现在提供了一种更方便的方式来创建后台作业,类似于 POSIX 兼容的 shell,通过&后台运算符
    • dotnet run ..\MyApiProject\API.csproj --no-build &

    • 此外,更轻量级的选项是使用线程作业而不是(基于子进程的)后台作业(ThreadJob提供Start-ThreadJobcmdlet 的模块随 PowerShell (Core) 7+ 一起提供,但也可以安装在 Windows PowerShell 中)

      • Start-ThreadJob { dotnet run ..\MyApiProject\API.csproj --no-build }

[1] 有关如何管理作业的信息,请参阅概念about_Jobs主题。请注意,在Windows PowerShell中需要 using以确保后台作业使用与调用者相同的当前位置;在 PowerShell (Core) 7+ 中不再需要,因为调用者的位置是自动继承的。$using:PWD | Set-Location


推荐阅读