脚本(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
而且,我想我只是回答了我自己的问题。
答案 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
您可以将路径作为参数传递吗?