我有一个实用程序函数和其他代码的集合,我把这些代码点到我编写的每个powershell文件中。在受到了影响它的调用范围变量的影响后,我开始研究将其更改为powershell模块。
我遇到了一些问题,我在其中做的一些特殊的事情,我确实想要在作用域之间进行一些交互。我想知道是否存在“获取”模块调用方的作用域,以便在迁移到powershell模块时保留此功能?
如果不是,我的最佳路径是将这些更专业的东西保存在点源文件中,并将更传统的实用程序函数转移到模块中吗?下面是一些不易移动到模块的东西:
发布于 2017-10-12 21:11:36
$PSCmdlet.SessionState似乎在脚本模块中提供了一个函数,只要调用站点在模块之外,就可以访问调用站点的变量。(如果调用站点位于模块内,则只需使用Get-和Set-Variable -Scope。)下面是一个使用SessionState的示例
New-Module {
function Get-CallerVariable {
param([Parameter(Position=1)][string]$Name)
$PSCmdlet.SessionState.PSVariable.GetValue($Name)
}
function Set-CallerVariable {
param(
[Parameter(ValueFromPipeline)][string]$Value,
[Parameter(Position=1)]$Name
)
process { $PSCmdlet.SessionState.PSVariable.Set($Name,$Value)}
}
} | Import-Module
$l = 'original value'
Get-CallerVariable l
'new value' | Set-CallerVariable l
$l哪种输出
original value
new value我不确定SessionState是否打算以这种方式使用。无论它的价值如何,这都是Get-CallerPreference.ps1中使用的相同技术。还有一些测试用例这里,它们传递PowerShell版本2到5.1。
发布于 2017-10-03 08:20:34
不知道我是否完全明白你想要的是什么。我相信您想知道调用您模块的cmdlet的代码在哪里实现。甚至更高的位置。
如果我是正确的,那么您可以使用Get-PSCallStack检索堆栈跟踪。例如,从未保存的脚本中看,它如下所示
PS C:\Users\asarafian> Get-PSCallStack
Command Arguments Location
------- --------- --------
<ScriptBlock> {} <No file>如果保存了该文件,则如下所示
PS C:\Users\asarafian> Get-PSCallStack
Command Arguments Location
------- --------- --------
File1.ps1 <No file>根据您想要实现的目标(我不太清楚),您需要从[0] (执行Get-PSCallStack到[x]的代码)遍历列表。
在构建XWrite时,我还想知道堆栈中的条目是脚本文件、模块的cmdlet部分还是未知的<ScriptBlock>。
我的实现是在Get-XCommandSource.ps1中实现的,它遵循以下逻辑,用于堆栈跟踪中的命令值
.ps1结尾,那么它就是一个脚本文件。<ScriptBlock>,那么它就是一个脚本块。Get-Command加载命令,那么.\cmdlet.ps1模式导入的cmdlet/函数。
以下是实现:
function Get-XCommandSource
{
[CmdletBinding(SupportsShouldProcess=$true)]
Param(
[Parameter(Mandatory=$true)]
[AllowEmptyString()]
[AllowNull()]
[string]$Command
)
begin {
}
process {
if(-not $Command)
{
"Unknown"
}
elseif($Command.EndsWith(".ps1"))
{
"Script"
}
elseif($Command -eq "<scriptblock>")
{
"Unknown"
}
else
{
$cmdlet=Get-Command -Name $command -ErrorAction SilentlyContinue
if($cmdlet)
{
$moduleName=$cmdlet|Select-Object -ExpandProperty ModuleName
if($moduleName)
{
$moduleName
}
else
{
"Function"
}
}
else
{
"Unknown"
}
}
}
end {
}
}https://stackoverflow.com/questions/46528262
复制相似问题