我做了一个验证一些参数的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
}
奖励问题,如果可能的话,我可以在后续验证块中重用这些变量吗?
您可以使用 byref varliable。
这将影响传递给它的变量,因此您可以同时具有受函数执行影响的返回值和参数。
关于参考
可以通过引用或值将变量传递给函数。
按值传递变量时,将传递数据的副本。
在下面的示例中,该函数更改了 变量传递给它。在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 参数对最终用户来说可能更容易。
请参阅关于作用域文档。
PowerShell 中的范围同时具有名称和编号。命名范围 指定绝对范围。这些数字是相对的,反映了 作用域之间的关系。
全局:PowerShell 启动时生效的范围。变量 以及 PowerShell 启动时存在的函数 在全局范围内创建,例如自动变量和 首选项变量。变量、别名和函数 PowerShell 配置文件也会在全局范围内创建。
本地:当前范围。本地作用域可以是全局作用域或 任何其他范围。
脚本:脚本文件运行时创建的范围。只有 脚本中的命令在脚本范围内运行。到命令中的 脚本,脚本范围是本地范围。
私有:在当前范围之外看不到私有范围内的项目 范围。可以使用专用作用域创建 另一个范围中具有相同名称的项。
编号范围:您可以按名称或编号引用范围 描述一个作用域与另一个作用域的相对位置。范围 0 表示当前或本地范围。范围 1 表示 直接父范围。范围 2 表示父级的父级 范围等。如果已创建多个,则编号范围很有用 递归作用域。