PowerShell 開始ジョブの作業ディレクトリ
-
19-09-2019 - |
質問
Start-Job コマンドに作業ディレクトリを指定する方法はありますか?
使用事例:
私はディレクトリ内にいて、編集のために Emacs を使用してファイルを開きたいと考えています。これを直接実行すると、Emacs を閉じるまで PowerShell がブロックされます。しかし、Start-Job を使用すると、ホーム ディレクトリから Emacs を実行しようとするため、Emacs は、私が望んでいたファイルではなく、新しいファイルを開いてしまいます。
$pwd を使用してフルパスを指定しようとしましたが、スクリプト ブロック内の変数は Start-Job コンテキストで実行されるまで解決されません。したがって、シェルコンテキストで変数を強制的に解決する何らかの方法も、これに対する許容可能な答えになります。
完全を期すために、私が試したことは次のとおりです。
Start-Job { emacs RandomFile.txt }
Start-Job { emacs "$pwd/RandomFile.txt" }
解決
の可能な解決策は、「キッカー・スクリプト」を作成することです
Start-Job -filepath .\emacs.ps1 -ArgumentList $workingdir, "RandomFile.txt"
あなたのスクリプトは次のようになります:
Set-Location $args[0]
emacs $args[1]
この情報がお役に立てば幸いです。
他のヒント
コメント欄からの素敵な解決策がありますいくつかの男のポストするの。コメント投稿には、スクリプトブロックのセットアップ作業ディレクトリにInit
パラメータを使用することを示唆しています。
function start-jobhere([scriptblock]$block) {
Start-Job -Init ([ScriptBlock]::Create("Set-Location '$pwd'")) -Script $block
}
問題を要約すると次のようになります。
バックグラウンドジョブが開始されました
Start-Job
する ない 現在の場所 (作業ディレクトリ) を継承します。デフォルトでは
$HOME\Documents
Windows PowerShell で、および$HOME
PowerShell コア (PSv5.1 / PSv6 アルファ時点)。使用している場合 パワーシェル 芯 内のファイルをターゲットにしています 現在 ディレクトリでは、以下を使用できます。 新しい
... &
構文はデフォルトでジョブを実行します。 現在 ディレクトリ:
emacs RandomFile.txt &
あなたはできません 直接 から変数を参照します。 現在 に渡されるスクリプト ブロック内のセッション
Start-Job
.
補完するために jdmichalさん自身の役立つ回答 そして asavartsovさんの役立つ回答, 、これはまだうまく機能します:
PSv3 では、 現在 別のコンテキスト (バックグラウンド ジョブまたはリモート マシン上) で実行されるスクリプト ブロック内のセッションの変数。 $using:
範囲:
Start-Job { Set-Location $using:PWD; emacs RandomFile.txt }
あるいは:
Start-Job { emacs $using:PWD/RandomFile.txt }
注記:
この GitHub の問題 を追加することを提案します
-WorkingDirectory
にStart-Job
コマンドレット。Start-Job -WorkingDirectory $PWD { emacs RandomFile.txt } # WISHFUL THINKING
この GitHub の問題 驚くほど使えないことを報告する
$using:
に渡されたスクリプト ブロック内-InitializationScript
, たとえメイン スクリプト ブロックで動作しても (暗黙的に-ScriptBlock
パラメータ)。Start-Job -Init { Set-Location $using:PWD } { emacs RandomFile.txt } # FAILS
これを試します
Start-Job -inputobject $pwd -scriptblock { emacs "$input/RandomFile.txt" }
ここで$input
は内部-inputobject
パラメータの値をとる事前に定義された変数です。
スタート-仕事は、あなたが(バックグラウンドでコマンドを実行している)必要なもののためにやり過ぎです。使用のではなくの-プロセスを起動します:
Start-Process -NoNewWindow emacs RandomFile.txt
このアプローチでは、現在のディレクトリとは問題がありません。私はまた、このような単純なを作るための関数を作成している可能な限ります:
function bg() {Start-Process -NoNewWindow @args}
、その後、呼び出しはなります:
bg emacs RandomFile.txt
これは、Windows 7(PowerShellのv2の)上で動作します。
ただ、完全を期すために、ここで私はFilburtの答え、コミュニティのwikiのスタイルに基づいて実装され、最終的なスクリプトがあります:
function Start-Emacs ( [string]$file )
{
Start-Job -ArgumentList "$pwd\$file" { emacs $args[0] }
}