我开发了一个PowerShell函数,它执行了许多涉及提供SharePoint团队站点的操作。最终,我想函数返回的URL提供的网站作为字符串,所以在我的函数结束,我有以下代码:
$rs = $url.ToString();
return $rs;
调用这个函数的代码如下所示:
$returnURL = MyFunction -param 1 ...
我期待的是一个字符串,但它不是。相反,它是System.Management.Automation.PSMethod类型的对象。为什么它返回的是那个类型而不是String类型?
PowerShell有非常古怪的返回语义——至少从更传统的编程角度来看是这样。这里有两个值得你思考的观点:
捕获并返回所有输出
return关键字实际上只是指示了一个逻辑退出点
因此,下面两个脚本块将有效地完成完全相同的事情:
$a = "Hello, World"
return $a
$a = "Hello, World"
$a
return
第二个示例中的$a变量被保留为管道上的输出,并且如前所述,将返回所有输出。事实上,在第二个示例中,您可以完全省略返回,并且您将得到相同的行为(返回将在函数自然完成和退出时隐含)。
没有更多的函数定义,我不能说为什么你得到一个PSMethod对象。我的猜测是,您可能有一些未被捕获的内容,它们被放置在输出管道中。
同样值得注意的是,您可能不需要这些分号——除非您在一行上嵌套多个表达式。
您可以在TechNet的about_Return页面上阅读更多关于返回语义的信息,或者通过从PowerShell本身调用帮助返回命令。
下面的函数简单地返回4作为答案。当你替换字符串的add表达式时,它会返回第一个字符串。
Function StartingMain {
$a = 1 + 3
$b = 2 + 5
$c = 3 + 7
Return $a
}
Function StartingEnd($b) {
Write-Host $b
}
StartingEnd(StartingMain)
这也可以用于数组。下面的例子将返回"Text 2"
Function StartingMain {
$a = ,@("Text 1","Text 2","Text 3")
Return $a
}
Function StartingEnd($b) {
Write-Host $b[1]
}
StartingEnd(StartingMain)
注意,必须调用函数本身下面的函数。否则,它第一次运行时将返回一个错误,它不知道“StartingMain”是什么。
现有的答案是正确的,但有时实际上并没有显式地返回Write-Output或return,但函数结果中有一些神秘的值。这可以是像New-Item这样的内置函数的输出
PS C:\temp> function ContrivedFolderMakerFunction {
>> $folderName = [DateTime]::Now.ToFileTime()
>> $folderPath = Join-Path -Path . -ChildPath $folderName
>> New-Item -Path $folderPath -ItemType Directory
>> return $true
>> }
PS C:\temp> $result = ContrivedFolderMakerFunction
PS C:\temp> $result
Directory: C:\temp
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2/9/2020 4:32 PM 132257575335253136
True
所有创建目录的额外噪音都被收集并在输出中发出。缓解这种情况的简单方法是在New-Item语句的末尾添加| Out-Null,或者您可以将结果分配给一个变量,但不使用该变量。它看起来是这样的……
PS C:\temp> function ContrivedFolderMakerFunction {
>> $folderName = [DateTime]::Now.ToFileTime()
>> $folderPath = Join-Path -Path . -ChildPath $folderName
>> New-Item -Path $folderPath -ItemType Directory | Out-Null
>> # -or-
>> $throwaway = New-Item -Path $folderPath -ItemType Directory
>> return $true
>> }
PS C:\temp> $result = ContrivedFolderMakerFunction
PS C:\temp> $result
True
New-Item可能是其中更著名的,但其他方法包括所有StringBuilder.Append*()方法,以及SqlDataAdapter.Fill()方法。
您需要在返回之前清除输出。尝试使用Out-Null。这就是powershell返回的工作原理。它返回的不是你想要的变量,而是整个函数的输出。你的例子是:
function Return-Url
{
param([string] $url)
. {
$rs = $url.ToString();
return
} | Out-Null
return $rs
}
$result = Return-Url -url "https://stackoverflow.com/questions/10286164/function-return-value-in-powershell"
Write-Host $result
Write-Host $result.GetType()
结果是:
https://stackoverflow.com/questions/10286164/function-return-value-in-powershell
System.String
致谢至https://riptutorial.com/powershell/example/27037/how-to-work-with-functions-returns