Erste Datei wird ohne Inhalt heruntergeladen
Hallo zusammen,
ich habe bei folgendem Script das Problem das die erste Datei die heruntergeladen wird, immer ohne Inhalt ist. Dazu bekomme ich bei der ersten Datei folgende Fehlermeldung:
ich habe bei folgendem Script das Problem das die erste Datei die heruntergeladen wird, immer ohne Inhalt ist. Dazu bekomme ich bei der ersten Datei folgende Fehlermeldung:
Ausnahme beim Aufrufen von "GetResponse" mit 0 Argument(en): "Der Remoteserver hat einen Fehler zurückgegeben: (550) Datei nicht verfügbar (z.B. nicht gefunden oder kein Zugriff)."
In C:\Users\administrator.MMM\Documents\download.ps1:39 Zeichen:9
+ $response = $ftpWebRequest.GetResponse()
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : WebException
Ausnahme beim Aufrufen von "CopyTo" mit 1 Argument(en): "Auf einen geschlossenen Datenstrom kann nicht zugegriffen werden."
In C:\Users\administrator.MMM\Documents\download.ps1:42 Zeichen:9
+ $responseStream.CopyTo($localFileStream)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ObjectDisposedException
CSV-Datei c.csv wurde erfolgreich heruntergeladen.
CSV-Datei a.csv wurde erfolgreich heruntergeladen.
CSV-Datei b.txt wurde erfolgreich heruntergeladen.
clear
# FTP-Server Informationen
$ftpServer = "servername"
$ftpUsername = "username"
$ftpPassword = "kennwort"
# Pfad zum Verzeichnis auf dem FTP-Server
$remoteDirectory = "/tmp/verzeichniss/"
# Lokaler Speicherort für die heruntergeladenen Dateien
$localDirectory = "C:\Temp\"
# Erstellen der Netzwerkverbindung
$ftpWebRequest = [System.Net.FtpWebRequest]::Create("ftp://$ftpServer/$remoteDirectory")
$ftpWebRequest.Credentials = New-Object System.Net.NetworkCredential($ftpUsername, $ftpPassword)
$ftpWebRequest.Method = [System.Net.WebRequestMethods+Ftp]::ListDirectory
# Liste der Dateinamen im Verzeichnis abrufen
$response = $ftpWebRequest.GetResponse()
$responseStream = $response.GetResponseStream()
$reader = New-Object System.IO.StreamReader($responseStream)
$remoteFileList = @()
while (!$reader.EndOfStream) {
$remoteFileList += $reader.ReadLine()
}
$reader.Close()
$response.Close()
# CSV-Dateien herunterladen
foreach ($remoteFileName in $remoteFileList) {
if ($remoteFileName -match '\.(txt|csv)$') {
$remoteFilePath = "$remoteDirectory$remoteFileName"
$localFilePath = Join-Path $localDirectory $remoteFileName
$ftpWebRequest = [System.Net.FtpWebRequest]::Create("ftp://$ftpServer/$remoteFilePath")
$ftpWebRequest.Credentials = New-Object System.Net.NetworkCredential($ftpUsername, $ftpPassword)
$ftpWebRequest.Method = [System.Net.WebRequestMethods+Ftp]::DownloadFile
$response = $ftpWebRequest.GetResponse()
$responseStream = $response.GetResponseStream()
$localFileStream = [System.IO.File]::Create($localFilePath)
$responseStream.CopyTo($localFileStream)
$localFileStream.Close()
$responseStream.Close()
$response.Close()
Write-Host "CSV-Datei $remoteFileName wurde erfolgreich heruntergeladen."
}
}
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 8102495322
Url: https://administrator.de/contentid/8102495322
Ausgedruckt am: 22.11.2024 um 12:11 Uhr
11 Kommentare
Neuester Kommentar
$remoteDirectory = "/tmp/verzeichniss/"
$remoteFilePath = "$remoteDirectory$remoteFileName"
"ftp://$ftpServer/$remoteFilePath"
Den Pfad korrigieren! Da ist ein Slash zu viel wenn die Variablen miteinander kombiniert werden.$remoteFilePath = "$remoteDirectory$remoteFileName"
"ftp://$ftpServer/$remoteFilePath"
Denn daraus wird am Ende das hier (Slash zu viel)
ftp://server.domain.tld//tmp/verzeichniss/datei.csv
Deswegen kommt dann der Fehler
Der Remoteserver hat einen Fehler zurückgegeben: (550) Datei nicht verfügbar (z.B. nicht gefunden oder kein Zugriff)."
und anschließend ist es hier auch normal das dann dieser kommtAuf einen geschlossenen Datenstrom kann nicht zugegriffen werden."
weil du hier eben kein Error-Handling machst (z-B. try catch) und der Stream dann natürlich geschlossen ist weil er eben keine Datei findet. Da gehört ein ordentliches Error-Handling hin! ... Try Catch finally is your friend.Gruß Siddius
Der Remoteserver hat einen Fehler zurückgegeben: (550) Datei nicht verfügbar (z.B. nicht gefunden oder kein Zugriff)."
Dann stimmt der Pfad immer noch nicht oder die Lese-Berechtigungen drauf fehlen.Prüfe den Pfad auch auf unsichtbare Zeichen wie \r\n Leerzeichen usw.
Die Fehlermeldung ist da eindeutig, die folgenden Fehler sind nur das Resultat des ersten Fehlers weil du kein Error-Handling machst und prüfst ob Verbindungen überhaupt offen sind oder eben try catch verwendest.
Scheint als ist der FTP-Server oder vorgeschaltete Router nicht richtig für die dynamischen FTP-Ports eingerichtet, wenn er den Data-Port erst nach dem ersten Kontakt promoted. FTP arbeitet mit Control- und separatem Data-Channel, nur falls das nicht bekannt sein sollte.
Ich würde ja auf PLAIN FTP gleich ganz verzichten und auf SFTP/FTPS & Co. über WinSCP umsteigen, Benutzername und Passwort als Plaintext in den Äther blasen da kann man den auch gleich als anonymen FTP einrichten macht nicht viel Unterschied .
Ich würde ja auf PLAIN FTP gleich ganz verzichten und auf SFTP/FTPS & Co. über WinSCP umsteigen, Benutzername und Passwort als Plaintext in den Äther blasen da kann man den auch gleich als anonymen FTP einrichten macht nicht viel Unterschied .
Kann das hier mit meinem Test-FTP-Server (ProFTPd) nicht nachvollziehen.
Scheint als ist der FTP-Server oder vorgeschaltete Router nicht richtig für die dynamischen FTP-Ports eingerichtet, wenn er den Data-Port erst beim zweiten Kontakt promoted. FTP arbeitet mit ja mit Control- und separaten Data-Channeln.
Scheint als ist der FTP-Server oder vorgeschaltete Router nicht richtig für die dynamischen FTP-Ports eingerichtet, wenn er den Data-Port erst beim zweiten Kontakt promoted. FTP arbeitet mit ja mit Control- und separaten Data-Channeln.
Einfach mal das WinSCP .NET Module nutzen wenn das da auch fehl schlägt ist der Server schuld.
https://winscp.net/eng/docs/library
bzw. das Powershell Module
Der Vorteil bei der Nutzung von WinSCP, das ganze wird gleich wesentlich schneller da nicht für jedes File eine separate FTP-Verbindung aufgebaut werden muss wie bei der MS FTP-Klasse.
https://winscp.net/eng/docs/library
bzw. das Powershell Module
Install-Module WinSCP
$conn = New-WinSCPSession -SessionOption (New-WinSCPSessionOption -FtpMode Passive -Credential (new-Object PSCredential('USERNAME',(ConvertTo-SecureString 'PASSWORD' -AsPlainText -Force))) -HostName "my.server.tld" -Protocol ftp)
$conn.GetFilesToDirectory('/tmp/verzeichnis','D:\temp','*.csv',$false,(New-WinSCPTransferOption -TransferMode Binary))
$conn.Close()