Start-Job与直接执行命令的方式不同?

时间:2014-10-07 15:38:27

标签: powershell dart

如果我从PS运行pub serve,它会正确地开始侦听8080,我可以从浏览器进行连接。

PS M:\Coding\Games\dart_games> pub serve
Loading source assets... (0.2s)
Serving dart_games web on http://localhost:8080
Build completed successfully

但是,如果我尝试将其作为Job运行,它似乎无法运作:

PS M:\Coding\Games\dart_games> Start-Job { pub serve }

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
--     ----            -------------   -----         -----------     --------             -------
4      Job4            BackgroundJob   Running       True            localhost             pub serve

PS M:\Coding\Games\dart_games> iwr http://localhost:8080/
iwr : Unable to connect to the remote server
At line:1 char:1
+ iwr http://localhost:8080/
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation:
        (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest],
        WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,
        Microsoft.PowerShell.Commands.InvokeWebRequestCommand

2 个答案:

答案 0 :(得分:3)

使用-ArgumentList参数传递所需目录:

Start-Job {param($path) cd $path; pub serve } -Arg $pwd

请记住,作业是在新的PowerShell流程中执行的,因此当前流程中的变量不会自动显示在那里,而像$ pwd这样的内置函数可能会设置不同。 -ArgumentList允许您传输工作流程所需的任何值。

答案 1 :(得分:1)

我设法使用Get-Job 4 | Receive-Job获取输出。它说没有找到pubspec.yaml。这意味着它正在错误的文件夹中运行!

我设法通过传递当前文件夹使其工作;虽然它有点笨拙。我找不到更好的方法:(

Start-Job -InputObject $pwd { CD $input; pub serve }

我将它们稍微包起来使其更容易使用(使用pubstartpubstop

Function Start-Pub
{
    Start-Job { param($path) cd $path; pub serve } -Arg $pwd
    & "M:\Apps\Dart\Dartium\chrome.exe" --user-data-dir="M:\Apps\Dart\DartiumProfile" "http://localhost:8080/"
}

Function Stop-Pub
{
    Get-Job -State Running | ? Location -eq localhost | ? Command -like "*pub serve*" | Stop-Job
}

Set-Alias pubstart Start-Pub
Set-Alias pubstop Stop-Pub

这不是万无一失的(当你拨打pubstop时会停止所有的酒吧),但还不错!