2010-11-19 2 views
2

나는 다음과 같은 명령처럼 뭔가 PowerShell은 작업을 시작 해요 : 그것은 그들의 상대적인 위치에 따라 다른 명령을 실행하기 때문에start-job -filename으로 시작할 때 어떤 스크립트가 실행 중인지 알 수있는 방법이 있습니까?

start-job -filename my_script.ps1 -argumentlist ($v1, $v2, $v3) 

이 스크립트는, 그러나, 클라이언트의 위치를 ​​알 필요가있다. 프롬프트에서 직접 실행하는 경우, 이들 작품으로 구성한다 : 첫 번째 예에서와 같이 작업으로 시작했을 때

join-path (split-path (& { $myinvocation.scriptname })) "relative path\filename" 
join-path (split-path $myinvocation.mycommand.definition) "relative path\filename" 

이 있지만, 전혀 작동하지 않습니다. 내가 일을 시작할 때 내가 어디에서 뛰고 있는지 어떻게 알 수 있습니까?

답변

2

파일이 스크립트 블록으로 작업에 전달되어 스크립트가 생성 된 파일의 개념이 상실되는 원격 처리 사례와 같이 보입니다. (즉, 이상적이지 보이더라도) 당신은뿐만 아니라 경로에 전달할 수 :

PS> gc .\job.ps1 
param($scriptPath) 
"Running script $scriptPath" 
PS> $job = Start-Job -FilePath .\job.ps1 -ArgumentList $pwd\job.ps1 
PS> Wait-Job $job 

Id Name   State  HasMoreData  Location Command 
-- ----   -----  -----------  -------- ------- 
13 Job13   Completed True   localhost param($scriptPath)... 


PS> Receive-Job $job.id 
Running script C:\Users\hillr\job.ps1 
0

업데이트 : 나는 등을 수정, 파일 경로 매개 변수를 사용하여, 스크립트 블록보다는

http://blog.brianhartsock.com/2010/05/22/a-better-start-job-cmdlet/

:

나는이 코드 예제를 건너 왔어요

param([string]$file) 

$filePath = split-path $file -parent 
Start-Job -Init ([ScriptBlock]::Create("Set-Location $filePath")) -FilePath $file -ArgumentList $args 

다음과 같이 표시됩니다.

Start-JobAt c:\full_path\to\file\my_script.ps1 ($v1, $v2, $v3) 

-Init (-InitializationScript)를 사용하고 Set-Location을 실행하면 현재 실행중인 프로세스가 스크립트의 디렉터리로 이동하므로 여기에서 상대 위치를 결정할 수 있습니다.

블로그 게시물에 언급 된 것처럼이 스크립트를 외부 스크립트 (Start-JobAt.ps1로 테스트) 또는 사용자/서비스 계정 프로필에 포함시킬 수 있습니다.

+0

나는 "현재 작업 디렉토리", 나는 "현재 실행중인 스크립트가 존재하는 디렉토리"원하는 싶지 않아요. – Mark

+0

아, 아 ~. 업데이트 된 응답. –

+0

그래, 최선보다는 작다. 필자는 스크립트의 경로를 매개 변수로 전달하기 만했습니다. – Mark