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의 경우$HOME
PowerShell 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
'programing' 카테고리의 다른 글
Mac OS X에서 Git 설치 폴더 찾기 (0) | 2023.08.14 |
---|---|
토쿠드와 프랙탈 나무 지수 (0) | 2023.08.14 |
Mariadb가 절전 모드 연결을 자동으로 닫는 시간 (0) | 2023.08.14 |
closedXml c#에서 자동 필터를 비활성화하는 방법은 무엇입니까? (0) | 2023.08.14 |
속성 대신 마커 인터페이스를 사용해야 하는 강력한 이유 (0) | 2023.08.14 |