Есть ли способ сказать, какой скрипт запущен при запуске с start-job -filename? - PullRequest
2 голосов
/ 19 ноября 2010

Я запускаю задание PowerShell с помощью следующей команды:

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 ]

2 голосов
/ 20 ноября 2010

Это похоже на случай удаленного взаимодействия, когда файл передается в задание в виде блока сценария, поэтому представление о том, из какого файла был получен сценарий, теряется. Вы также можете пройти по пути (хотя это кажется далеко не идеальным):

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 голосов
/ 19 ноября 2010

ОБНОВЛЕНО:

Я сталкивался с этим примером кода:

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

Вместо ScriptBlock, чтобы использовать параметр FilePath,Я изменил его так:

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) или сделать егочасть профиля вашей учетной записи пользователя / службы.

...