PowerShell变量冲突

时间:2010-02-25 05:24:32

标签: powershell

我有一个变量,这个变量在我的大多数应用中都很常见,称为“电子邮件”。我还想在其中一个脚本中使用“电子邮件”作为参数的名称。我需要在同一个脚本中引用这两个变量的值。理想情况下,有一种方法可以使用模块/命名空间或其他东西进行引用,也许还有,但我不知道。你可以看到我是如何破解它的,但它很丑陋,容易出错。还有更好的方法吗?

# PowerShell v1
# Some variable names are very common.
param ($emails)

# My Hack
# We need to save current value so we have it after we source in variables below.
$emails0=$emails

# Below is going to load a variable called "emails" which will overwrite parm above.
. C:\load_a_bunch_of_global_variables.ps1

4 个答案:

答案 0 :(得分:7)

这是因为文档说:(点源操作符)运行脚本,以便脚本中的项目成为调用范围的一部分。

在这种情况下,我会将C:\load_a_bunch_of_global_variables.ps1转换为模块并将$emails作为参数传递,或者导出一个在模块中设置$script:emails变量的函数。然后变量不会与父脚本中的变量冲突。

有关模块的更多信息,请使用get-help about_modules


如果可能,我会避免在我的脚本中使用全局变量。

为什么呢?因为它是代码气味(正如程序员所说)。使用一个脚本没有问题。如果两个脚本使用相同的全局变量并且只读取,则可能是可接受的。但是如果它们中的任何一个改变了价值,那么可能会有不愉快的冲突。

在某些情况下Get-Variable -scope 1 -name myvariable会有所帮助,但我只会在模块或短脚本等封闭的代码中使用它(与全局变量的原因相同)。

答案 1 :(得分:2)

虽然您可以使用Get-Variable -scope来访问调用堆栈的任意级别的变量,但在这种情况下使用脚本更容易获取顶级(到脚本)变量:modifier,例如:

$script:emails

答案 2 :(得分:1)

重新运行和stej都帮助了我。

我仍然希望使用“.file.ps1”来源文件,但在我的load_a_bunch_of ... ps1文件中将“$emails = foo@yahoo.com”更改为“$ global:emails=foo@yahoo.com “解决了问题。当我有一个本地变量和一个全局变量时,我现在可以使用全局关键字来引用变量,当只有一个变量可以处理时,我可以省略全局关键字。

答案 3 :(得分:0)

您可以在脚本中使用$ global:var name从脚本访问全局变量,您可以使用本地范围,并且不会发生冲突。如果你 。来源你的脚本你将覆盖全局变量。

对于Ex,如果有脚本

$Crap ="test"
$Crap

你运行流畅的命令,你得到你想要的。在第2行中,我们运行脚本并且var不会产生冲突但是如果您使用a运行第4行中的脚本。来源你得到你发现的东西由于方式。运营商工作

1:PS C:\Users\Adam> $crap = "hi"
2:PS C:\Users\Adam> .\test.ps1
test
3:PS C:\Users\Adam> $crap 
hi
4:PS C:\Users\Adam> . .\test.ps1
test
5:PS C:\Users\Adam> $crap
test
6:PS C:\Users\Adam>

如果您将以下行添加到脚本中运行它

$global:crap;

你会得到

PS C:\Users\Adam> .\test.ps1
test
hi