我实际上是编写脚本,而我脚本的一部分是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
中找到它 - 但没有成功。
如果有人能解释我在这里发生什么事,真的会很酷。如上所述,代码有效,但我想了解这里发生了什么。
答案 0 :(得分:6)
这是
$reader.ReadToEnd()
StreamReader.ReadToEnd()方法输出字符串,因为它的结果未分配给变量,所以它将是函数输出。
惯用法就是这样写:
Write-Output $reader.ReadToEnd()
答案 1 :(得分:4)
在PowerShell中,如果您没有将或 pipe 分配给任何东西,则每个命令/语句的结果都将作为输出返回。
返回关键字仅退出当前范围。您很少在PowerShell中使用return
。
正如beatcracker所提到的,$reader.ReadToEnd()
正在产生输出。