我开发了一个PowerShell函数,它执行许多涉及配置SharePoint Team站点的操作。最终,我希望该函数以字符串的形式返回供应网站的URL,以便在函数结尾处具有以下代码:
$rs = $url.ToString();
return $rs;
调用此函数的代码如下所示:
$returnURL = MyFunction -param 1 ...
所以我期待一个字符串,但事实并非如此。相反,它是System.Management.Automation.PSMethod类型的对象。为什么它会返回该类型而不是字符串类型?
发布于 2018-03-30 10:41:38
PowerShell具有非常古怪的返回语义 - 至少从更传统的编程角度来看。有两个主要想法可以包围你的头:
因此,以下两个脚本块将有效地完成同样的事情:
$a = "Hello, World"
return $a
$a = "Hello, World"
$a
return
第二个例子中的$ a变量作为流水线上的输出保留,并且如前所述,返回所有输出。事实上,在第二个例子中,你可以完全忽略返回,并且你会得到相同的行为(当函数自然完成和退出时,返回将被隐含)。
没有更多的函数定义,我不能说你为什么得到一个PSMethod对象。我的猜测是你可能有几行没有被捕获的东西,并且正在被放置在输出管线上。
还值得注意的是,你可能不需要这些分号 - 除非你在一行中嵌套多个表达式。
可以在TechNet 的about_Return页面上阅读关于返回语义的更多信息,或者help return
从PowerShell本身调用该命令。
发布于 2018-03-30 11:36:55
这部分PowerShell可能是最愚蠢的方面。在函数期间产生的任何多余的输出都会污染结果,有时候没有输出,并且在某些情况下,除了计划的返回值外,还有一些其他计划外输出。
所以,我所做的就是从原始函数调用中除去赋值,以便输出在屏幕上结束,然后逐步执行,直到我没有计划在调试器窗口中弹出(使用PS ISE)。
即使诸如在外部范围中保留变量之类的东西[boolean]$isEnabled
也会导致输出,就像这样会令人烦恼地吐出一个False,除非你这样做[boolean]$isEnabled = $false
。
另一个好的是$someCollection.Add("thing")
吐出新的收藏数量。
https://stackoverflow.com/questions/-100004326
复制相似问题