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