在ps1中使用全局变量

问题描述 投票:1回答:2

我似乎找不到足够好的解决方案来解决我的问题。有没有一种很好的方法可以将变量分组到某种文件中,以便多个脚本可以访问它们?

我一直在使用期望状态配置做一些工作,但是需要完成的工作不能以这种方式有效地实现。关键是在服务器上安装Azure Build Agent,然后对其进行配置。有些变量确实不应该在脚本文件中,只是像个人访问令牌一样进行复制。我只是希望能够轻松地更改它,而无需进入每个将使用它的脚本。在DSC中,您只需创建.psd1文件并访问变量,例如AllNodes.NodeName。配置文件调用和参数如下所示:

.\config.cmd --unattended --url $myUrl --auth PAT --token $myToken --pool default --agent "$env:COMPUTERNAME" --acceptTeeEula --work $workDir'

我想让外部文件中的变量$ myToken可以访问,以获得更好的安全性,并拥有一个可以更改值的集中位置。 $ myUrl对于访问也很重要,因为它随着Build Agent的新更新而改变。

提前感谢您的努力。如果有什么不清楚请告诉我。

powershell scripting dsc
2个回答
0
投票

我对你的问题有两个非常不同的答案,尽管其中任何一个都可能忽略了你的观点。

首先,可以在配置文件脚本中定义变量。大多数人只使用配置文件脚本来定义函数库或类。但是变量可以以相同的方式变为全局变量。

我有一个名为$ myps的变量,用于标识我保存PS脚本的文件夹(在子文件夹中)。

当我开始一个会话时,我通常会切换到这个目录(哎呀,我称之为上面的文件夹。

第二种方法是将变量值存储在CSV文件中,而名称存储在CSV header.i中,然后有一个快速的小comandlet,逐步执行CSV文件,逐个记录,每次通过生成不同的模板扩展。

这些值不是全局的,但可以在多个上下文中使用。


0
投票

感谢您的帮助。在某些情况下,这些是非常有用的解决方案,但我挖得更深,找到了适合我目的的解决方案。基本上如果你有一个适合DSC使用的psd1文件,你也可以通过普通的ps1文件访问它的内容。例如:

NonNodeData = 
@{
    Pat = 'somePAT'
}

假设一个名为ENV.psd1的psd1文件的这一部分位于C:/ Configuration中的本地计算机上

要访问此文件的内容,您必须在脚本中创建一个变量并使用Import-PowerShellDataFile,如下所示:

$configData = Import-PowerShellDataFile -Path "C:\Configuration\ENV.psd1"

现在您可以自由使用ENV.psd1中存储的任何内容。例如,如果我想从配置文件中提取我的PAT,以便能够将其存储在脚本中的变量中:

$myPat = $configData.NonNodeData.Pat

多亏了我可以在调用config.cmd时将$ myPat作为参数传递,如下所示:

.\config.cmd --unattended --auth PAT --token $myPat

保持我的代码更清洁,更容易进行任何未来的更新。

© www.soinside.com 2019 - 2024. All rights reserved.