$ MyInvocation в потоке пространства выполнения - PullRequest
0 голосов
/ 27 июня 2018

Сценарий (foo.ps1) создает поток, и этот поток создает больше потоков. Поток Foo - это мой управляющий поток, и он создает один или несколько рабочих потоков. Рабочие потоки запускают блок скрипта. Блок скрипта вызывает функции из библиотеки-скрипта. В скрипте библиотеки есть файл конфигурации.

Блок скрипта загружает библиотеку-скрипт путем ее точечного поиска.

$block = {
  Param($library_script)
  . $library_script
  ...stuff...
}

Когда скрипт загружается, первым делом он находит свой файл конфигурации, который находится в каталоге скрипта. Код для этого выглядит так ...

## Global variables and enumerations
$script:self_location = $script:MyInvocation.MyCommand.Path
$script:configuration_file_location = "{0}.config" -f $script:self_location

Моя проблема в том, что $MyInvocation не существует. В результате библиотечный скрипт не может найти свой файл конфигурации.

Я использую Powershell 5.1 в Windows 10. Управляющий поток был создан в пространстве выполнения. Рабочие потоки создаются в пуле пространства выполнения.

Кто-нибудь знает правила, касающиеся автоматической переменной $MyInvocation в потоках пространства выполнения?

Создайте файл foo.ps1 и добавьте в него следующее:

Write-Output '[1] Executed in-scope'
$MyInvocation.MyCommand.Path

Write-Output '[2] Executed in-thread'
$p1 = [PowerShell]::Create()
$p1.AddScript({ $MyInvocation.MyCommand.Path }) | Out-Null
$p1.Invoke()
$p1.Dispose()

Write-Output '[3] Executed in-thread in-thread'
$t = {
$p = [PowerShell]::Create()
$p.AddScript({ $MyInvocation.MyCommand.Path }) | Out-Null
$p.Invoke()
}

$p2 = [PowerShell]::Create()
$p2.AddScript( $t ) | Out-Null
$p2.Invoke()
$p2.Dispose()

Запустите его. Вы должны увидеть что-то вроде следующего ...

[1] Executed in-scope
C:\Users\deezNuts\development\comcast\sandbox\thing.ps1
[2] Executed in-thread
[3] Executed in-thread in-thread

И, я думаю, я просто ответил на свой вопрос.

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Я вижу переменную в потоке.

$rsp = [runspacefactory]::CreateRunspacePool(1, 2, $iss, $Host)
$rsp.ApartmentState = "STA"
$rsp.ThreadOptions = "ReuseThread"
$rsp.Open()

$p = [PowerShell]::Create()
$p.RunspacePool = $rsp
$p.AddScript({ write-host $MyInvocation.MyCommand.Path })
$h = $p.BeginInvoke()
$p.EndInvoke($h)

$p.Dispose()
$rsp.Dispose()

Что ты делаешь по-другому?

0 голосов
/ 27 июня 2018

Я не уверен, что переменная $ MyInvocation поддерживается в фоновом задании

Start-Job -Name Test -ScriptBlock {Get-Variable}
Receive-Job Test

Можете ли вы передать путь в качестве параметра?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...