Сценарий (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
И, я думаю, я просто ответил на свой вопрос.