Powershell 在ps1中使用全局变量

Powershell 在ps1中使用全局变量,powershell,scripting,dsc,Powershell,Scripting,Dsc,我似乎找不到足够好的办法来解决我的问题。有没有一种好方法可以将变量分组到某种文件中,以便多个脚本可以访问它们 我一直在用所需的状态配置做一些工作,但是需要做的工作不能以这种方式有效地实现。关键是在服务器上安装Azure Build Agent,然后对其进行配置。有些变量实际上不应该像个人访问令牌一样复制粘贴在脚本文件中。我只是希望能够轻松地更改它,而不需要深入到每个脚本中使用它。在DSC中,您可以创建一个.psd1文件并访问变量,例如AllNodes.NodeName。配置文件调用和参数如下所示

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

我一直在用所需的状态配置做一些工作,但是需要做的工作不能以这种方式有效地实现。关键是在服务器上安装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的新更新而变化


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

对于你的问题,我有两个完全不同的答案,尽管其中任何一个可能没有抓住你的重点

首先,可以在配置文件脚本中定义veriables。大多数人只使用概要文件脚本来定义函数或类库。但变量也可以用同样的方法全局化

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

当我启动一个会话时,我通常会切换到这个目录(oops,我在上面称它为文件夹)

第二种方法是将变量的值存储在CSV文件中,而名称存储在CSV头文件中。然后,我有一个快速的小comandlet,它一个记录一个记录地遍历CSV文件,每次都生成不同的模板扩展


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

对于您的问题,我有两个非常不同的答案,尽管其中任何一个可能没有抓住您的重点

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

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

当我启动一个会话时,我通常会切换到这个目录(oops,我在上面称它为文件夹)

第二种方法是将变量的值存储在CSV文件中,而名称存储在CSV头文件中。然后,我有一个快速的小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

保持我的代码更干净,便于将来进行任何更新。

感谢您的帮助。在某些情况下,这些都是非常有用的解决方案,但我深入挖掘了一些,找到了适合我的目的的解决方案。基本上,如果您有适合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

保持我的代码更干净,便于将来进行任何更新。

将所有函数放在同一个模块中,然后将其定义为一个
script
作用域变量(即
$script:module
)从一个模块函数或在
.psm1
文件中。这样,您的所有模块函数都可以访问它,但您不能直接从全局范围访问它。是否可以创建一个只包含变量的模块,然后使用导入模块访问它们?它是否可以在不将所有内容放入一个文件的情况下工作?将所有函数放入一个文件,然后将其定义为作用域变量(即
$script:module
)从一个模块函数或在
.psm1
文件中。这样,您的所有模块函数都可以访问它,但您不能直接从全局范围访问它。是否可以创建一个只包含变量的模块,然后使用导入模块访问它们?它是否可以在不将所有内容放入一个文件的情况下工作?