Powershell 多输出变量

问题描述 投票:0回答:3

我是 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。

谁能告诉我哪里出错了,以及如何实现这个“简单”的结果?

powershell function variables
3个回答
1
投票

你想做什么:

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

0
投票

试试这段代码,你应该使用

[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

0
投票

如果用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

您分别计算每个变量。如果需要在一个函数中计算多个变量,将结果作为数组返回。

© www.soinside.com 2019 - 2024. All rights reserved.