hansbaer
Goto Top

Überprüfen eines FTP-Verzeichnisses ob Ordner vorhanden ist

Hallo mal wieder,

ich möchte gerne mit hilfe einer batch überprüfen, ob auf einem FTP Server ein bestimmtes Verzeichnis vorhanden ist.
So Sachen wie "if exist", etc kann ich ja bei ftp Protokoll nicht verwenden, oder?

Beste Grüße,

hansbaer

Content-ID: 235619

Url: https://administrator.de/contentid/235619

Ausgedruckt am: 23.11.2024 um 05:11 Uhr

colinardo
colinardo 15.04.2014, aktualisiert am 16.04.2014 um 09:22:32 Uhr
Goto Top
Hallo hansbaer,
mit Batch müsstest du die Ausgabe von ftp mit findstr auf den Return-Code vom cd-Befehl hin durchsuchen. Das könnte so aussehen:
@echo off
set FTPSERVER=ftp.deinserver.de
set FTPUSER=USERNAME
set FTPPASS=PASSWORD
set ORDNER=/pfad/abc/deinordner

set "commandfile=%temp%\remotecommands.txt"  

echo open %FTPSERVER%>"%commandfile%"  
echo %FTPUSER%>>"%commandfile%"  
echo %FTPPASS%>>"%commandfile%"  
echo cd %ORDNER%>>"%commandfile%"  
echo quit>>"%commandfile%"  

ftp -i -s:"%commandfile%" | findstr /b "550" >nul && goto EXISTIERTNICHT || goto EXISTIERT  

:EXISTIERTNICHT
echo Ordner existiert nicht 
goto weiter

:EXISTIERT
echo Ordner existiert

:weiter
del /q "%commandfile%" 2>nul  
Alternativ ein Script mit AutoIT als Konsolenanwendung kompiliert und du hast auch eine Lösung (Server und Zugangsdaten ab Zeile 6 eintragen)
Genutzt wird das kompilierte Programm dann so
check_ftp.exe "/pfad/zum/Ordner"
Als Parameter gibt man den Pfad zum Ordner an welchen du auf Vorhandensein überprüfen willst (ohne abschließenden Slash).
Es gibt dann als Exit-Code eine 0 aus wenn es den Ordner gefunden hat und eine 1 wenn nicht, bei einem anderen Fehler eine 2.
back-to-topAutoIt-Console-Script zum testen ob ein FTP-Ordner existiert
#NoTrayIcon
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Change2CUI=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <FTPEx.au3>
Const $FTPSERVER = "ftp.domain.de"  
Const $USERNAME = "USERNAME"  
Const $PASSWORD = "PASSWORD"  

global $ftppath,$folder,$found
if $cmdline = 1 then
		$arr = StringRegExp($cmdline[1],"^(.*)/(.*)$",3)  
		if UBound($arr) < 1 then
			ConsoleWriteError("Fehler - Der FTP-Pfad sollte immer mit eine Slash '/' beginnen")  
			Exit 2
		EndIf
		$ftppath = $arr
		$folder = $arr[1]
Else
	ConsoleWriteError("Fehler - Fehlender FTP-Pfad als erster Parameter!")  
	exit 2
EndIf

$open = _FTP_Open("FTP-Connection")  
if $open = 0 then
	ConsoleWriteError("Fehler - Keine Internetverbindung.")  
	exit 2
endif

$conn = _FTP_Connect($open,$FTPSERVER,$USERNAME,$PASSWORD)
if $conn = 0 then
	ConsoleWriteError("Fehler - Konnte die FTP-Verbindung nicht aufbauen")  
	_FTP_Close($conn)
	exit 2
EndIf
if $ftppath <> "" then  
	$ret = _FTP_DirSetCurrent($conn,$ftppath)
	if $ret = 0 then
		ConsoleWriteError("Fehler - Konnte nicht in das angegebene Verzeichnis wechseln ")  
		_FTP_Close($conn)
		exit 2
	EndIf
endif

$dirArray = _FTP_ListToArray($conn,1)
_FTP_Close($conn)

if $dirArray > 0 then
	for $i = 1 to $dirArray
		if $dirArray[$i] = $folder then
			$found = true
			exitloop
		endif
	Next
EndIf

if $found then
	ConsoleWrite("GEFUNDEN: '" & $cmdline[1])  
	exit 0
Else
	ConsoleWrite("NICHT GEFUNDEN: '" & $cmdline[1])  
	exit 1
Endif

Noch eine Möglichkeit ist es die Library von WINSCP zu nutzen (die unterstützt auch SFTP/FTPS SSH Verbindungen), und das z.B. so mit Powershell prüfen ob ein Ordner existiert:
back-to-topMit Powershell und der WinSCP .NET-Library überprüfen ob ein FTP-Ordner existiert
[Reflection.Assembly]::LoadFrom("C:\WinSCPnet.dll")  
$sessionOptions = New-Object WinSCP.SessionOptions
$sessionOptions.Protocol = [WinSCP.Protocol]::Ftp
$sessionOptions.HostName = "ftp.domain.de"  
$sessionOptions.UserName = "USERNAME"  
$sessionOptions.Password = "PASSWORD"  
$session = New-Object WinSCP.Session
try{
    $session.Open($sessionOptions)
    $exists = $session.FileExists("/Pfad/testOrdner")  
    if ($exists){
      write-host "Ordner existiert"  
    }else{
      write-host "Ordner konnte nicht gefunden werden"  
    }
}
finally{
    $session.Dispose()    
}
Hierzu benötigt man das .NET-Assembly(.dll) und die EXE von WinSCP die man hier herunterladen kann: http://winscp.net/eng/download.php
Diese sollten dann zusammen im selben Verzeichnis liegen.

Grüße Uwe