programing

PowerShell 시작 작업 작업 디렉터리

magicmemo 2023. 8. 14. 22:47
반응형

PowerShell 시작 작업 작업 디렉터리

Start-Job 명령에 작업 디렉터리를 지정하는 방법이 있습니까?

사용 사례:

저는 디렉토리에 있고, 편집을 위해 Emacs를 사용하여 파일을 열고 싶습니다.이 작업을 직접 수행하면 Emacs를 닫을 때까지 PowerShell이 차단됩니다.그러나 Start-Job을 사용하면 홈 디렉토리에서 Emacs를 실행하려고 하므로 Emacs가 내가 원하는 파일 대신 새 파일을 열게 됩니다.

$pwd를 사용하여 전체 경로를 지정하려고 했지만 스크립트 블록의 변수는 시작-작업 컨텍스트에서 실행될 때까지 해결되지 않습니다.따라서 셸 컨텍스트에서 변수를 강제로 해결하는 방법도 이에 대한 허용 가능한 답변입니다.

완성도를 위해 노력한 것은 다음과 같습니다.

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

어떤 친구의 게시물의 댓글 섹션에서 좋은 해결책이 있습니다.해설자가 사용할 것을 제안합니다.Init스크립트 블록의 작업 디렉터리를 설정하는 매개 변수입니다.

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

업데이트:

PowerShell [Core] 7.0다음과 같이 향상되었습니다.

  • 백그라운드 작업(스레드 작업 및ForEach-Object -Parallel) 이제 호출자의 현재(파일 시스템) 위치를 상속합니다.

  • 새로운-WorkingDirectory매개 변수를 사용하여 디렉터리를 명시적으로 지정할 수 있습니다.


문제를 요약합니다(윈도우즈 PowerShell 및 PowerShell Core 6.x적용).

  • 백그라운드 작업은 다음으로 시작되었습니다.Start-Job현재 위치(작업 디렉토리)를 상속하지 않습니다.

    • 기본값은$HOME\Documents윈도우즈 PowerShell의 경우$HOMEPowerShell Core에 저장합니다.

    • PowerShell Core를 사용하는 경우 구문이 기본적으로 현재 디렉터리에서 작업을 실행하므로 다음을 사용할 수 있습니다.
      emacs RandomFile.txt &

  • 전달된 스크립트 블록에서 현재 세션의 변수를 직접 참조할 수 없습니다.Start-Job.

Jdmichal의 유용한 답변과 Savartsov의 유용한 답변을 보완하기 위해, 여전히 잘 작동합니다.

PSv3는 다른 컨텍스트(배경 작업 또는 원격 시스템)에서 실행되는 스크립트 블록에서 현재 세션의 변수 값을 참조하는 간단한 방법을 도입했습니다.$using:범위:

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

또는 다음과 같습니다.

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

참조


참고:

  • 이 GitHub 문제는 놀라운 사용 불능을 보고합니다.$using:전달된 스크립트 블록에서-InitializationScript메인 스크립트 블록에서 작동하지만(암묵적)-ScriptBlock매개 변수).
    • Start-Job -Init { Set-Location $using:PWD } { emacs RandomFile.txt } # FAILS

가능한 해결책은 "키커 스크립트"를 만드는 것입니다.

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

스크립트는 다음과 같습니다.

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

이게 도움이 되길 바랍니다.

이것을 먹어보세요.

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)에서 작동합니다.

완성도를 위해, 필버트의 대답인 커뮤니티 위키 스타일을 기반으로 구현한 최종 스크립트는 다음과 같습니다.

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

언급URL : https://stackoverflow.com/questions/2224350/powershell-start-job-working-directory

반응형