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)是将所有这些排成一行,这也是不可读的.
完全是多余的,当我可以调用上面的函数时,在其中定义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)
| 归档时间: |
|
| 查看次数: |
128 次 |
| 最近记录: |