Powershell 是否可以强制来自一个模块的函数对来自不同模块的变量执行只读设置?

Powershell 是否可以强制来自一个模块的函数对来自不同模块的变量执行只读设置?,powershell,variables,module,scope,Powershell,Variables,Module,Scope,嗨,想象一下这种情况。您有下面定义的2个powershell模块。 如果您将它们导入控制台,只需在控制台中运行代码,就可以使用变量test,但不能修改它的预期行为。但是来自第二个模块的函数changeVariable不支持只读设置,内部可以通过variable test执行任何操作 第一模块: 新模块{ 新变量测试-值测试-选项AllScope,恒力-范围全局 导出模块成员-变量* } 第二模块: 新模块{ 函数变量{ $test=someString这应该以错误结束,无法更改该变量 $test

嗨,想象一下这种情况。您有下面定义的2个powershell模块。 如果您将它们导入控制台,只需在控制台中运行代码,就可以使用变量test,但不能修改它的预期行为。但是来自第二个模块的函数changeVariable不支持只读设置,内部可以通过variable test执行任何操作

第一模块:

新模块{ 新变量测试-值测试-选项AllScope,恒力-范围全局 导出模块成员-变量* } 第二模块:

新模块{ 函数变量{ $test=someString这应该以错误结束,无法更改该变量 $test } 导出模块成员-函数* }
那么,是否可以在powershell中创建全局不可修改变量?

第二个模块没有从全局范围访问$test变量。它从函数的作用域访问变量。您需要指出它是一个全局变量。一种方法是使用全局范围修饰符

New-Module {
function changeVariable {
    $global:test = "someString" # this should end with error, that variable cannot be changed 
    $global:test
}

Export-ModuleMember -Function *

}

还有其他作用域可以与$[:]=语法一起使用。请参阅。

好的,我明白了,但这不是可用的解决方案。我需要一些通用的解决方案,而不是重写所有函数。如果可能的话。因此,模块中的函数与控制台中定义的函数的行为相同。变量默认为当前范围。如果不让第二个模块也尝试在全局范围内创建变量,并且让其余代码显式使用全局范围内的变量,那么您所要求的是不可能的。