2016-06-20 3 views
1

Ich versuche, einige ZIP-Dateien von einem FTP-Server herunterladen. Der FTP-Server ist wie diese strukturiertPowerShell: System.Net.WebClient.DownloadFile wird keine Dateien von ListDirectory herunterladen

ftp://ftp.example.com 
| 
-> /Download 
    | 
    -> file1.zip, file2.zip, file3.zip etc 

Ich habe alle Dateien in ein Array gezogen genannt $ftpFiles

foreach ($zip in $ftpFiles) 
{ 
    $LocalFile = "C:\Temp\$zip" 
    $RemoteFile = "$site/$zip" 
    $ftp = New-Object System.Net.WebClient 
    $ftp.Credentials = new-object System.Net.NetworkCredential($Username, $realPassword) 
    $uri = New-Object System.Uri("$RemoteFile") 
    $ftp.DownloadFile($uri, $LocalFile) 
    Write-Host "$zip download complete" 
} 

Das Problem ist $ftp.DownloadFile mit meinem $LocalFile Variable nicht. Wenn ich jedoch manuell die $LocalFile Informationen eingeben, wird es.

Zum Beispiel

$ftp.DownloadFile($uri, "C:\temp\file1.zip") 

funktioniert gut, aber

$ftp.DownloadFile($uri, $LocalFile) 

gibt mir die folgenden Fehler

Exception calling "DownloadFile" with "2" argument(s): "An exception occurred during a WebClient request." 
At line:1 char:34 
+     $ftp.DownloadFile <<<< ($uri, $LocalFile) 
+ CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
+ FullyQualifiedErrorId : DotNetMethodException 

Für Debugging-Zwecke Ich habe

tun
write-host $LocalFile 

, die korrekt als

C:\Temp\file1.zip 

Wie ich erwartet zurück.

Ich kann nur davon ausgehen, dass DownloadFile die verschachtelte Variable nicht mag und liest es als C:\Temp\$zip und ich bin mir nicht sicher, wie ich es beheben kann.

EDIT: Kommentare sehen wollen, wie die $files Array

$site = $ftpbase + $dir 

$ftp = [System.Net.FtpWebRequest]::Create("$site") 
$ftp.Method = [System.Net.WebRequestMethods+FTP]::ListDirectory #Details 
$ftp.Credentials = new-object System.Net.NetworkCredential($Username, $realPassword) 

$response = $ftp.getresponse() 
$stream = $response.getresponsestream() 

$buffer = new-object System.Byte[] 1024 
$encoding = new-object System.Text.AsciiEncoding 

$outputBuffer = "" 
$foundMore = $false 

## Read all the data available from the stream, writing it to the 
## output buffer when done. 
do 
{ 

    ## Allow data to buffer for a bit 
    start-sleep -Seconds 2 

    ## Read what data is available 
    $foundmore = $false 
    $stream.ReadTimeout = 1000 

    do 
    { 
     try 
     { 
      $read = $stream.Read($buffer, 0, 1024) 

      if($read -gt 0) 
      { 
       $foundmore = $true 
       $outputBuffer += ($encoding.GetString($buffer, 0, $read)) 

      } 
     } catch { $foundMore = $false; $read = 0 } 
    } while($read -gt 0) 
} 
while($foundmore) 

$files = $outputBuffer -split ("\n") 
+1

Verwenden Sie [Join-Path] (https://technet.microsoft.com/en-us/library/hh849799.aspx), um Ihren Pfad gemäß den Best Practices der Powershell zu erstellen. – jkdba

+0

Danke, aber das hat mein Problem nicht behoben. – godofgrunts

+2

* "Ich kann nur davon ausgehen, dass DownloadFile die verschachtelte Variable nicht mag und liest es als C: \ Temp \ $ zip" * - Das ist nur ein Unsinn. Das 'DownloadFile' erfährt nicht einmal, dass eine Variable verwendet wurde. Du arbeitest mit Code. Ich habe es getestet. –

Antwort

3

Der Ausgang des ListDirectory gebaut wird, ist im ASCII-Modus, wo Linien durch \r\n getrennt sind. Sie teilen die Ausgabe nur durch die \n, so dass die \r im Dateinamen beibehalten wird. Der Download schlägt fehl, da die Datei file1.zip\r nicht existiert. Wenn Sie file1.zip\r drucken, werden Sie die \r nicht sehen.

+1

Wow. Vielen Dank. – godofgrunts