我是 PowerShell 的新手,我仍在努力学习基础知识,如果这看起来很明显,我很抱歉......
我一直在探索这个网站和微软的网站,但我不知道如何实现下面的例子。
我做了如下测试功能。我想输入变量 i 并输出 j 和 k。
函数 true/false 的值将给出它的状态,以防它遇到错误。
当然,我已经在极端情况下简化了我想要实现的目标,但这说明了我的问题。
function ftest {
try {
Param ($i,$j,$k)
$j = $i+1
$k = $i-1
return $true
}
catch { return $false }
}
$i0 = 3
$j0 = 0
$k0 = 0
$t0 = ftest -i $i0 -j $j0 -k $k0
当我一步一步地执行这段代码时,一切都很好,但是在函数被处理之后,变量 $j0 和 $k0 保持在 0 而不是分别预期的 4 和 2。
谁能告诉我哪里出错了,以及如何实现这个“简单”的结果?
你想做什么:
function ftest {
param ($i, [ref] $j, [ref] $k)
try {
$j.Value = $i + 1
$k.Value = $i - 1
return $true
}
catch {
return $false
}
}
$i0 = 3
$j0 = 0
$k0 = 0
$t0 = ftest -i $i0 -j ([ref] $j0) -k ([ref] $k0)
$t0 # True
$j0 # 4
$k0 # 2
更新函数作用域外变量的值要求该变量是引用类型。其他替代方法是使用
script:
范围修饰符,但随后 $j
和 $k
不应作为参数传递给函数:
function ftest {
param ($i)
try {
$script:j0 = $i + 1
$script:k0 = $i - 1
return $true
}
catch {
return $false
}
}
$i0 = 3
$j0 = 0
$k0 = 0
$t0 = ftest -i $i0
$t0 # True
$j0 # 4
$k0 # 2
你应该做什么:
function ftest {
param ($i)
try {
[pscustomobject]@{
i = $i
j = $i + 1
k = $i - 1
}
}
catch {
return $false
}
}
$i0 = 3
$t0 = ftest -i $i0
# $t0:
#
# i j k
# - - -
# 3 4 2
试试这段代码,你应该使用
[ref]
通过引用传递值
function ftest([ref]$i, [ref]$j, [ref]$k){
$j.Value = $i.Value + 1
$k.Value = $i.Value - 1
}
$i = 3
$j = [ref]0
$k = [ref]0
ftest -i ([ref]$i) -j $j -k $k
Write-Host $i
Write-Host $j.Value
Write-Host $k.Value
输出
3
4
2
如果用clean函数就更好了
function ftest{
Param([scriptblock]$FunctionToCall,$one,$two)
$($FunctionToCall.Invoke($one,$two))
}
$scriptBlock1 = {
param($one,$two)
$one + $two
}
$scriptBlock2 = {
param($one,$two)
$one - $two
}
$i0 = 1
$j0 = 1
$k0 = 1
$j0 = ftest -FunctionToCall $scriptBlock1 -one $i0 -two $j0
$k0 = ftest -FunctionToCall $scriptBlock2 -one $i0 -two $k0
$j0
$k0
退货
2
0
您分别计算每个变量。如果需要在一个函数中计算多个变量,将结果作为数组返回。