문제

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] }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top