我制作了一个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
}
奖金问题,如果可能的话,我可以在后续的验证块中重用这些变量吗?
答案 0 :(得分:0)
您可以使用byref变量。
这将影响传递给它的变量,因此您可能同时具有返回值和受函数执行影响的参数。
您可以按引用或按值将变量传递给函数。
按值传递变量时,即传递数据的副本。
在下面的示例中,该函数更改 变量传递给它。在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指示父级的父级 范围等。如果您创建了许多范围,则带编号的作用域非常有用 递归范围。