在 ps1 中使用全局变量
Using global variables in a ps1
我似乎找不到足够好的解决方案来解决我的问题。有没有一种好的方法可以在某种文件中对变量进行分组,以便多个脚本可以访问它们?
我一直在使用 Desired State Configuration 做一些工作,但需要完成的工作无法以这种方式有效地实施。重点是在服务器上安装 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 的新更新而改变。
提前感谢您的努力。如果有任何不清楚的地方,请告诉我。
对于您的问题,我有两个截然不同的答案,尽管其中任何一个都可能不符合您的观点。
首先,可以在配置文件脚本中定义变量。大多数人只使用配置文件脚本来定义函数库或 类。但是可以用同样的方式使变量成为全局变量。
我有一个名为 $myps 的变量,用于标识我保存 PS 脚本的文件夹(在子文件夹中)。
当我开始一个会话时,我通常会切换到这个目录(哎呀,我把它称为上面的文件夹。
第二种方法涉及将变量的值存储在 CSV 文件中,而名称存储在 CSV 中 header.i 然后有一个快速的小 comandlet,逐个记录地遍历 CSV 文件,生成不同的每次通过模板扩展。
这些值不是很通用,但可以在不止一种情况下使用。
感谢您的帮助。在某些情况下,这些是非常有用的解决方案,但我更深入地挖掘并找到了适合我目的的解决方案。基本上,如果您有适合 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
让我的代码更干净,更容易进行任何未来的更新。
我似乎找不到足够好的解决方案来解决我的问题。有没有一种好的方法可以在某种文件中对变量进行分组,以便多个脚本可以访问它们?
我一直在使用 Desired State Configuration 做一些工作,但需要完成的工作无法以这种方式有效地实施。重点是在服务器上安装 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 的新更新而改变。
提前感谢您的努力。如果有任何不清楚的地方,请告诉我。
对于您的问题,我有两个截然不同的答案,尽管其中任何一个都可能不符合您的观点。
首先,可以在配置文件脚本中定义变量。大多数人只使用配置文件脚本来定义函数库或 类。但是可以用同样的方式使变量成为全局变量。
我有一个名为 $myps 的变量,用于标识我保存 PS 脚本的文件夹(在子文件夹中)。
当我开始一个会话时,我通常会切换到这个目录(哎呀,我把它称为上面的文件夹。
第二种方法涉及将变量的值存储在 CSV 文件中,而名称存储在 CSV 中 header.i 然后有一个快速的小 comandlet,逐个记录地遍历 CSV 文件,生成不同的每次通过模板扩展。
这些值不是很通用,但可以在不止一种情况下使用。
感谢您的帮助。在某些情况下,这些是非常有用的解决方案,但我更深入地挖掘并找到了适合我目的的解决方案。基本上,如果您有适合 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
让我的代码更干净,更容易进行任何未来的更新。