PowerShell START-JOB 작업 디렉토리
-
19-09-2019 - |
문제
START-JOB 명령에 작업 디렉토리를 지정하는 방법이 있습니까?
유스 케이스 :
디렉토리에 있고 편집하기 위해 EMACS를 사용하여 파일을 열고 싶습니다. 이 작업을 직접 수행하면 EMAC를 닫을 때까지 PowerShell을 차단합니다. 그러나 START-JOB를 사용하여 내 홈 디렉토리에서 EMAC를 실행하려고 시도하므로 EMACS가 원하는 파일 대신 새 파일을 열 수 있습니다.
$ pwd를 사용하여 전체 경로를 지정하려고 시도했지만 스크립트 블록의 변수는 시작 작업 컨텍스트에서 실행될 때까지 해결되지 않습니다. 따라서 쉘 컨텍스트에서 변수를 해결하는 데 도움이되는 방법은 이에 대한 허용 가능한 대답이 될 것입니다.
그래서 여기에 내가 시도한 내용은 완전성을 위해 다음과 같습니다.
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
하다 ~ 아니다 현재 위치를 상속받습니다 (Working Directory).기본값
$HOME\Documents
Windows PowerShell에서$HOME
PowerShell Core (PSV5.1 / PSV6 알파)에서.사용하는 경우 PowerShell 핵심 그리고 당신은 파일을 목표로하고 있습니다 현재의 디렉토리, 다음을 사용할 수 있습니다. 새로운
... &
구문은 기본적으로 작업을 실행합니다 현재의 예배 규칙서:
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
cmdlet.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-JOB는 필요한 것에 대한 과잉입니다 (백그라운드에서 명령을 실행). 사용 시작 프로세스 대신에:
Start-Process -NoNewWindow emacs RandomFile.txt
이 접근법에서는 현재 디렉토리에 문제가 없습니다. 또한 이것을 최대한 간단하게 만들기위한 기능을 만들었습니다.
function bg() {Start-Process -NoNewWindow @args}
그리고 호출은 다음과 같습니다.
bg emacs RandomFile.txt
이것은 Windows 7 (PowerShell V2)에서 작동합니다.
완전성을 위해 Filburt의 답변 인 Community-Wiki 스타일을 기반으로 구현 한 최종 스크립트는 다음과 같습니다.
function Start-Emacs ( [string]$file )
{
Start-Job -ArgumentList "$pwd\$file" { emacs $args[0] }
}