2017-10-11 11 views
1

私は実際にスクリプトを作成しており、スクリプトの一部はFTPファイルのダウンロードです。コードワードは何の問題もありませんが、私は1つの特定の部分を理解していません。私が自分で書いたコードの唯一の部分です。私はコードがどのように動作するのか理解していますが、関数がその値をどのように返すのかは分かりません。この関数はどのようにその値を返しますか?

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は、サーバー上のすべてのファイル名を持つ($allXmlFilesgetTypeでテスト)の文字列が含まれています。今私の質問:どのようにFTPからの答えは、この変数に渡されますか?関数にはreturnがありません。だから私はこれがどう動くか混乱しています。私はそうしようとしたtry/catch機能と直接答えにアクセスするが、それは動作しませんでした。私は$reader$ftpresponseでそれを見つけようとしましたが、成功しませんでした。

誰かがここで何が起こっているのか説明できれば、本当にクールだ。言われたように、コードは機能しますが、ここで何が起こっているのか理解したいと思います。

答えて

6

それだ

$reader.ReadToEnd() 

StreamReader.ReadToEnd()メソッドは、文字列を出力し、それの結果が変数に割り当てられていないので、それは関数の出力となります。

慣用的な方法は、このようにそれを書くことになります:あなたは何にもパイプそれを割り当てていない場合

PowerShellの、すべてのコマンド/文の結果で
Write-Output $reader.ReadToEnd() 
4

は出力として返されます。 returnキーワードは、現在のスコープを終了します。 PowerShellではほとんどreturnを使用しません。

ビートクラッカーが述べたように、$reader.ReadToEnd()が出力を生成しています。

関連する問題