Powershell中的显式返回

VSO*_*VSO 2 powershell pure-function

我可以在javascript中编写以下代码:

function sum(num1, num2) {
  return num1 + num2;
}
Run Code Online (Sandbox Code Playgroud)

然后得到一个值

var someNum = sum(2,5);
Run Code Online (Sandbox Code Playgroud)

我想在Powershell中做同样的事情,但我阅读了以下指南:

PowerShell也知道return关键字; 然而,它遵循不同的逻辑.通常,返回的目的是结束代码段的执行并将控件返回给父块.

如果向return语句添加参数,则该值将确实返回到调用子例程.但是,这也适用于具有输出的所有其他语句.这意味着函数中产生的任何输出都将与返回参数一起存储在变量中.

我想为了拥有纯粹的功能而这样做.但是,它似乎正在做

var someNum = sum(2,5);

完全是多余的,当我可以调用上面的函数,定义someNum它的内部,它将在全局范围内可用.

我错过了什么或者是否有可能在Powershell中编写纯函数而不返回函数内部的所有内容?


有点切,但这是我的实际代码:

function GetPreviousKeyMD5Hashes() {
    $query = "SELECT Name, MD5, executed FROM [AMagicDb].[dbo].cr_Scripts";

    $command = New-Object System.Data.SQLClient.SQLCommand;
    $command.Connection = $connection;
    $command.CommandText = $query;

    try {
        $reader = $command.ExecuteReader();
        while ($reader.Read()) {
            $key = $reader.GetString(1)
            $previousScripts.Add($key) | Out-Null
        }

        $reader.Close();
        Write-Output "$(Get-Date) Finished querying previous scripts"
    }
    catch {
        $exceptionMessage = $_.Exception.Message;
        Write-Output "$(Get-Date) Error running SQL at with exception $exceptionMessage"
    }
}
Run Code Online (Sandbox Code Playgroud)

然后:

$previousScripts = New-Object Collections.Generic.HashSet[string];
GetPreviousKeyMD5Hashes;
Run Code Online (Sandbox Code Playgroud)

这个代码对我来说根本不清楚 - 运行GetPreviousKeyMD5Hashes确实设置了$previousScripts,但是对于那些在我之后修改它的人来说这完全不清楚.我唯一的另一种选择(afaik)是将所有这些排成一行,这也是不可读的.

mkl*_*nt0 5

完全是多余的,当我可以调用上面的函数时,在其中定义someNum,它将在全局范围内可用.

否:函数在子作用域中执行(除非您使用它们进行点源.),因此在函数内创建或赋值的变量是本地的.

我错过了什么或者是否有可能在Powershell中编写纯函数而不返回函数内部的所有内容?

是:该隐输出行为仅适用于报表,其输出既不捕获 - $var = ...-也不重定向 -... > foo.txt

如果有一些语句恰好产生了您想要丢弃的输出,请使用$null = ...或... > $null

注意:... | Out-Null原则上也有效,但通常会表现更差,特别是在早期的PowerShell版本中 - 感谢TheIncorrigible1.

如果有想要写入的状态消息而不是它们成为输出的一部分,请使用Write-Host或者,最好Write-Verbose或在PSv5 +中Write-Information,尽管注意后两者需要选择加入它们的输出才能在控制台中可见.
不要使用Write-Output写入状态消息,因为它写入成功输出流,其目的是输出数据("返回值").有关PowerShell输出流的更多信息,
请参阅我的这个答案.

因此,您的JavaScript代码相当于:

function sum($num1, $num2) {
  Write-Host "Adding $num1 and $num2..."  # print status message to host (console)
  $num1 + $num2 # perform the addition and implicitly output result
}

PS> $someNum = sum 1 2 # NOTE: arguments are whitespace-separated, without (...)
Adding 1 and 2...  # Write-Host output was passed through to console

PS> $someNum  # $someNum captured the success output stream of sum()
3
Run Code Online (Sandbox Code Playgroud)