在PS1中使用全局变量

时间:2019-02-13 11:22:26

标签: powershell scripting dsc

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

我一直在使用所需状态配置进行一些工作,但是无法以这种方式有效地实现需要完成的工作。关键是要在服务器上安装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的新更新而更改。

预先感谢您的努力。如果不清楚,请告诉我。

2 个答案:

答案 0 :(得分:0)

我对您的问题有两个截然不同的答案,尽管其中任何一个都可能遗漏您的观点。

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

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

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

第二种方法涉及将变量的值存储在CSV文件中,而名称存储在CSV标头中.i然后有一个快速小命令,逐步浏览CSV文件,逐条记录,生成模板的不同扩展每次。

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

答案 1 :(得分: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

使我的代码更整洁,更容易进行以后的任何更新。