该函数如何返回其值?

时间:2017-10-11 07:50:34

标签: function powershell

我实际上是编写脚本,而我脚本的一部分是FTP文件下载。代码字没有任何问题,但我不理解一个特定的部分。它是我自己编写的代码中唯一的部分。我理解代码是如何工作的,但实际上我并不理解函数如何返回它的值。您可能会对我的意思感到困惑,所以让我用一些代码解释一下:

function get-ftp {

    try {

        $ftprequest = [system.net.ftpwebrequest]::Create($uri)
        $ftprequest.Credentials = New-Object system.net.networkcredential($user,$pass)
        $ftprequest.Proxy = $null
        $ftprequest.Method = [System.Net.WebRequestMethods+FTP]::ListDirectory
        $ftpresponse = $ftprequest.GetResponse()
        $reader = New-Object IO.StreamReader $ftpresponse.GetResponseStream() 
        $reader.ReadToEnd()
        $reader.Close()
        $ftpresponse.Close()

    }

    catch {

        Write-host "Error while reading filenames"

    }
}

所以这是我从FTP服务器获取所有目录的功能。我用这段代码调用了这个函数:

$allXmlFiles = get-ftp

因此,在调用之后,我的$allXmlFiles包含一个字符串(在getType上使用$allXmlFiles进行测试),其中包含服务器上的所有文件名。现在我的问题:FTP的答案是如何传递给这个变量的?函数中没有return,所以我很困惑这是如何工作的。我尝试过将try/catch从函数中取出并直接访问答案,但这没有用。我试图在$reader$ftpresponse中找到它 - 但没有成功。

如果有人能解释我在这里发生什么事,真的会很酷。如上所述,代码有效,但我想了解这里发生了什么。

2 个答案:

答案 0 :(得分:6)

这是

$reader.ReadToEnd()

StreamReader.ReadToEnd()方法输出字符串,因为它的结果未分配给变量,所以它将是函数输出。

惯用法就是这样写:

Write-Output $reader.ReadToEnd()

答案 1 :(得分:4)

在PowerShell中,如果您没有 pipe 分配给任何东西,则每个命令/语句的结果都将作为输出返回。 返回关键字仅退出当前范围。您很少在PowerShell中使用return

正如beatcracker所提到的,$reader.ReadToEnd()正在产生输出。