运行空间线程中的$ MyInvocation

时间:2018-06-27 13:20:01

标签: multithreading powershell

脚本(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似乎不存在。结果,库脚本找不到它的配置文件。

我正在Windows 10上运行Powershell 5.1。控制线程是在运行空间中完成的。工作线程是在运行空间池中创建的。

有人知道运行空间线程中自动$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 :(得分:1)

我在线程中看到了变量。

$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()

您在做什么不同的事情?

答案 1 :(得分:0)

我不确定后台作业是否支持$ MyInvocation变量

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

您可以将路径作为参数传递吗?