我可以重用Powershell验证块中定义的变量吗?

时间:2019-07-20 01:08:23

标签: powershell validation global-variables

我制作了一个Powershell脚本来验证一些参数。在验证过程中,我需要创建一些字符串。在脚本的后面,我还需要这些字符串。

为了避免再次重建相同的字符串,我可以重用验证块中定义的变量吗?也许我可以以某种方式在验证块中使用函数?还是全局变量?我不确定这里有什么可能,或者什么是好的做法。

示例:

Test.ps1

Function Test {
    param(
        [string]
        [Parameter(Mandatory=$true)]
        $thing1

        [string]
        [Parameter(Mandatory=$true)]
        $thing2

        [string]
        [Parameter(Mandatory=$true)]
        [ValidateScript({
            $a = Get-A $thing1
            $b = Get-B $thing2
            $c = $a + $b
            $d = Get-D $c
            if(-not($d -contains $_)) {
                throw "$_ is not a valid value for the thing3 parameter."
            }
            return $true
        })]
        $thing3
    )

    # Here I'd like to use $c
    # At worst, calling Get-A and Get-B again may be expensive
    # Or it could just be annoying duplication of code
}

奖金问题,如果可能的话,我可以在后续的验证块中重用这些变量吗?

1 个答案:

答案 0 :(得分:0)

您可以使用byref变量。

这将影响传递给它的变量,因此您可能同时具有返回值和受函数执行影响的参数。

About Ref

  

您可以按引用或按值将变量传递给函数。

     

按值传递变量时,即传递数据的副本。

     

在下面的示例中,该函数更改   变量传递给它。在PowerShell中,整数是值类型,因此它们   通过价值传递。因此,$ var的值在外部不变   功能范围。

Function Test{
Param($thing1,$thing2,[ref]$c) 

$c.Value = new-guid

return $true

}

#$ThisIsC = $null 
test -c ([ref] $ThisIsC)

Write-Host $ThisIsC  -ForegroundColor Green

或者,您可以使用$script$global范围。

对于一个简单的脚本可以快速公开您的变量,$script范围将做到这一点。如果您打算通过明确传递需要传递参考参数的方式来分配功能,则最终用户可能更容易使用byref参数。

请参阅About Scopes文档。

  

PowerShell中的作用域同时具有名称和数字。命名范围   指定一个绝对范围。这些数字是相对的,反映了   范围之间的关系。

     

全局:PowerShell启动时生效的范围。变数   和启动PowerShell时存在的功能   在全局范围内创建,例如自动变量和   偏好变量。您的变量,别名和函数   PowerShell配置文件也在全局范围内创建。

     

本地:当前范围。本地范围可以是全局范围,也可以是   任何其他范围。

     

脚本:运行脚本文件时创建的作用域。只有   脚本中的命令在脚本作用域中运行。到一个命令   脚本,脚本作用域就是本地作用域。

     

私有:在当前范围之外无法看到私有范围内的项目   范围。您可以使用私有作用域创建私有版本的   另一个作用域中具有相同名称的项目。

     

编号范围:您可以按名称或通过以下编号引用范围:   描述一个范围相对于另一个范围的相对位置。范围0   代表当前或本地范围。范围1表示   直接父范围。范围2指示父级的父级   范围等。如果您创建了许多范围,则带编号的作用域非常有用   递归范围。