2014-01-17 37 views
2

我在Windows上使用powershell運行sbt。我正試圖找出殺死sbt的最佳方法。當我想要這樣做的一個例子是,如果我忘記設置我的代理設置。如果我忘記設置它們,sbt通常會在嘗試解析每個依賴項時掛起30秒或更長時間。如果存在一堆依賴關係,則需要等待它們全部失敗。在Windows PowerShell中殺死sbt

如果這是cygwinbash,我很肯定ctrl+c會工作,但它似乎沒有效果在PowerShell中。我也試過ctrl+break似乎給線程轉儲,但不會停止進程。我可以去任務管理器並搜索這個進程並殺死它,但是我希望有一個更簡單的方法,也不總是明白我應該從任務管理器中殺掉哪個進程。

我也試過ctrl+zctrl+d和其他一些似乎沒有多大作用的人。我猜這是一個沒有通過信號傳遞的PowerShell問題,但我不確定。

+0

你是如何從Powershell啓動它的? – mjolinor

+0

在這種情況下,任務管理器的更好替代方法是Process Explorer:http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx使用此功能,您可以看到該進程的完整命令行。 –

+0

爲什麼我們不能找到sbt.exe或其他什麼,並通過$ PID來阻止它? 'Get-Process sbt | ForEach-Object -Process {Stop-Process -Id $ _。ID}'告訴我我們正在談論的可執行文件的名稱。 –

回答

0

您使用的是哪個版本的Powershell?對我而言,Ctrl+C在運行sbt時產生了一個提示Terminate batch job (Y/N)?,當我輸入Y時終止了sbt。這與標準終端和ConEmu一起工作,所以很奇怪它不適合你。

由於scala在JVM下運行,因此運行sbt不會導致名爲sbt的進程,而是一個名爲java的進程。出於這個原因,你必須檢查進程的命令行參數,看它是否是sbt。你可以一個命令行屬性添加到獲取進程的結果:

Update-TypeData -TypeName System.Diagnostics.Process -MemberName CommandLine -MemberType ScriptProperty -ea silent -Value { $id = $this.Id; $result = Get-WmiObject win32_process -Filter "ProcessId = $id"; $result.CommandLine }; 

...這將讓您在不同的PowerShell窗口輸入以下殺SBT:

ps java | ? commandline -m "sbt" | kill 

另外,您可以在不同的終端中使用Powershell,例如ConEmu(我最喜歡的)或Console2,它可以讓您選擇在任何給定的終端窗口/選項卡中終止當前正在運行的進程。