【发布时间】:2015-02-15 14:19:38
【问题描述】:
我有一个 PowerShell 脚本,它由一个主 PS1 文件组成,然后加载多个模块。在其中一个模块中,我定义了一个变量 $global:locationsXml ,然后在没有全局标志的情况下继续添加它,它工作得很好。我可以在没有任何其他模块的全局标志的情况下引用它。 但是,我还定义了一个 $global:loadedDefinitions = @() 数组并添加到其中。但是当我用 += 添加它时,我必须用全局标志来引用这个变量。我可以在没有全局标志的任何其他模块中引用它,但在创建模块中我需要它。该模块与 xml 变量的工作方式不同/正确的模块相同。 我还有一个哈希表,我在没有全局标志的情况下定义了它,但是在加载所有模块的顶级脚本中,我可以从任何地方在没有全局标志的情况下引用它。此外,我尝试在父脚本中初始化问题数组,如哈希表,但该数组仍然需要填充它的模块中的全局标志。但不在只读取它的不同模块中。 所有这些目前都在 Windows 7 和 PS 2.0 中进行测试。 所以,在我拆开东西之前,我想知道;是否存在已知错误,全局数组的行为与其他全局变量不同,特别是在模块中写入时? 我想包括用于写入我需要的几个数组的全局标志不会有什么大不了的,但我想了解发生了什么,特别是如果它是某种预期的行为而不是错误。
编辑:澄清一下,这是可行的
Script:
Define Hash Table without global specifier;
Load Module;
Call Function in Module;
Read and write Hash Table without global specifier;
这行得通
Script:
Load Module;
Call Function in Module;
Initialize Array with global specifier;
Append to Array with global specifier;
Reference Array from anywhere else WITHOUT global specifier;
这不是
Script:
Load Module;
Call Function in Module;
Initialize Array WITH global specifier;
Append to Array without global specifier;
Reference Array from anywhere fails;
这种方法,仅使用全局说明符初始化变量,然后在没有它的情况下引用它适用于其他变量,但不适用于数组,“似乎”是我看到的行为/错误。奇怪的是,全局说明符只需要在初始化 Array 的模块中使用,而不需要在任何其他模块中使用。我还没有验证它是否也只是在初始化它的函数中,和/或只是写入数组,而不是读取。
【问题讨论】:
-
嗯,我觉得我的情况有点不同。我没有传递任何讨论过的变量,也没有任何同名的局部变量。我将编辑原始帖子以澄清,因为我可以在那里使用退货。
-
我原来也是这么想的,但是我发现一旦一个变量是全局的,那么它在所有范围内都是可用的,因此不再需要全局说明符了。在我的情况下,我将所有内容作为从快捷方式启动的脚本运行,因此根本不涉及 ISE。事实上,我不需要使用全局,我应该能够使用脚本级别的范围,但我的理解是(有缺陷的?)模块的实现方式需要全局范围。如果您不使用模块,则不需要全局范围。
-
我还需要查看更高版本。可能这种在没有说明符的情况下引用全局范围的能力本身就是一个错误,V3 或更高版本修复了它。
-
经过测试,可在Win8.1/v4下运行。意思是在没有全局说明符的情况下读取全局变量。我可能会测试写入行为,但由于我的 80% 的客户仍在使用 Windows 7 并且不会很快更改或升级 PowerShell,如果这样做也没关系,我必须解决这个问题。
标签: debugging powershell global-variables