2010-02-08 130 views
21

有沒有辦法指定開始工作命令的工作目錄?PowerShell開始工作工作目錄

用例:

我在一個目錄下,我想打開使用Emacs編輯的文件。如果我直接執行此操作,它將阻止PowerShell,直到關閉Emacs。但是使用Start-Job嘗試從我的主目錄運行Emacs,從而讓Emacs打開一個新文件而不是我想要的文件。

我試圖使用$ pwd指定完整路徑,但腳本塊中的變量在開始任務環境中執行前未解析。所以強制解析shell上下文中的變量的方法也是可以接受的答案。

所以,這裏就是我試過,只是爲了完整性:

Start-Job { emacs RandomFile.txt } 
Start-Job { emacs "$pwd/RandomFile.txt" } 

回答

13

一個可能的解決方案是創建一個「踢球者腳本」:

Start-Job -filepath .\emacs.ps1 -ArgumentList $workingdir, "RandomFile.txt" 

您的腳本會是什麼樣子這個:

Set-Location $args[0] 
emacs $args[1] 

希望這會有所幫助。

+1

這種合作的很好。 -ArgumentList正是我一直在尋找的東西。 – jdmichal 2010-02-17 18:49:27

+0

請記住,只有當'$ workingdir'不包含空格或其他特殊字符時才能使用。 – DiscoInfiltrator 2013-02-05 18:34:33

+0

@DiscoInfiltrator:在PowerShell中只傳遞'$ workingdir'就可以正常工作,即使嵌入空格和其他shell元字符(你可能會想到POSIX類的shell)。使用'$ dir ='C:\ Program Files \'驗證;函數foo(){set-location $ args [0]}; foo $ dir'。 – mklement0 2016-12-09 06:50:57

2

只是爲了完整性,這裏是我實現了基於Filburt的答案,社區wiki模式的最終腳本:

function Start-Emacs ([string]$file) 
{ 
    Start-Job -ArgumentList "$pwd\$file" { emacs $args[0] } 
} 
6

試試這個

Start-Job -inputobject $pwd -scriptblock { emacs "$input/RandomFile.txt" } 

這裏$input是預定義變量,內服值-inputobject參數

4

Start-Job對於您所需要的(在後臺運行命令)是一種矯枉過正的行爲。使用開始處理代替:

Start-Process -NoNewWindow emacs RandomFile.txt 

有與本辦法的當前目錄中沒有問題。我還創建了一個功能,使這個儘可能簡單:

function bg() {Start-Process -NoNewWindow @args} 

,然後調用變爲:

bg emacs RandomFile.txt 

這可以在Windows 7(PowerShell的V2)。

+0

但終端關閉後,啓動進程仍然存在? – CMCDragonkai 2014-04-21 22:52:25

17

comments section of some dude's post有很好的解決方案。評論者建議使用Init參數來設置腳本塊的工作目錄。

function start-jobhere([scriptblock]$block) { 
    Start-Job -Init ([ScriptBlock]::Create("Set-Location '$pwd'")) -Script $block 
} 
+0

++適用於最通用的解決方案:不需要幫助腳本,也不需要後臺腳本塊需要了解和處理的輸入參數。 – mklement0 2016-06-12 16:53:35

+0

這應該有大約$ PWD引號來操作空間路徑 – ghostbust555 2016-07-06 15:13:34

+0

@ ghostbust555是需要正確的,單引號,因爲這不是一個變量引用,但在一個字符串變量擴展。 – Sander 2017-05-29 11:10:07

3

總結問題:

  • 後臺作業開始Start-Job繼承當前位置(工作目錄)。

    • 缺省爲$HOME\Documents在Windows PowerShell中,並在PowerShell核心$HOME(如PSv5.1/PSv6阿爾法)。

    • 如果您使用PowerShell的核心和你在當前目錄瞄準一個文件,你可以使用下面的,因爲... &語法默認運行在工作當前目錄
      emacs RandomFile.txt &

  • 你不能直接參考變量從當前會話在腳本塊傳遞到Start-Job

爲了補充jdmichal's own helpful answerasavartsov's helpful answer,仍然運行良好:

PSv3介紹一個簡單的方法來引用該在不同的上下文中執行一個腳本塊(當前會話的變量作爲背景工作或在遠程計算機上),經由$using:範圍:

Start-Job { Set-Location $using:PWD; emacs RandomFile.txt } 

或者:

Start-Job { emacs $using:PWD/RandomFile.txt } 

注:

  • This GitHub issue提出加入-WorkingDirectoryStart-Job cmdlet的。

    • Start-Job -WorkingDirectory $PWD { emacs RandomFile.txt } # WISHFUL THINKING
  • This GitHub issue報告令人吃驚無法傳遞給-InitializationScript腳本塊使用$using:,即使它工作在主腳本塊(隱含-ScriptBlock參數)。

    • Start-Job -Init { Set-Location $using:PWD } { emacs RandomFile.txt } # FAILS