我正在尝试找到一种在导入模块时获取脚本名称和路径的一般方法。我有三个问题,但我一直无法弄清楚如何使主要问题起作用。这是我的“测试”代码:
Test.ps1
#Requires -Version 5.0
#Requires -Module @{ModuleName='ModuleTest';RequiredVersion='1.0'}
#---remove module to retest the above line
# Remove-Module -Name ModuleTest -Force
#---uncomment and remove requires to test import
#Import-Module -Name ModuleTest -Force
write-host 'Done...'
ModuleTest.psm1-保存在模块路径中,通过$ env:PSModulePath导入
#Requires -Version 5.0
write-host "callstack = $((Get-PSCallStack).Command -join '; ')"
write-host "ScriptName = $($MyInvocation.ScriptName)"
write-host "PSScriptRoot = $($MyInvocation.PSScriptRoot)"
write-host "PSCommandPath = $($MyInvocation.PSCommandPath)"
write-host "Location = $((Get-Location).path)"
function xyz{...}
function abc{...}
1)从命令提示符处导入模块,调用堆栈返回 <ScriptBlock
>
callstack = ModuleGroup.psm1; <ScriptBlock>
ScriptName =
PSScriptRoot =
PSCommandPath =
Location = D:\Powershell
Done...
2)使用导入模块的脚本返回完整的 MyInvocation 信息
callstack = ModuleTest.psm1; Test.ps1
ScriptName = **D:\Powershell\psModules\ModuleTest\1.0\Tests\Test.ps1**
PSScriptRoot = D:\Powershell\psModules\ModuleTest\1.0\Tests
PSCommandPath = D:\Powershell\psModules\ModuleTest\1.0\Tests\Test.ps1
Location = D:\Powershell
Done...
3)使用#Requires -Module语句返回没有有关呼叫者的信息。 (在测试之间删除模块)
callstack = ModuleTest.psm1
ScriptName =
PSScriptRoot =
PSCommandPath =
Location = D:\Powershell
Done...
我一直在搜索和测试,尝试使用范围和$ script / $ global以及我能想到的所有内容。我希望模块代码检索这些值,而不是传递它们的脚本,这样我每次引用该模块时都不必特别注意。
如果没有其他问题,当MyInvocation中没有内容时,我将不允许#Requires并引发错误。
答案 0 :(得分:0)
仅在调用脚本,函数和脚本块之后设置$ MyInvocation变量。因此,在使用命令提示符时未设置该变量。 Requires语句不应对此产生影响。