werner1966
Goto Top

WINSCP, Anzahl der Dateien zählen

Hallo allerseits,

Ich nutze WINSCP in der Console (mit Batchaufruf und script)
Ich habe ein Script erstellt, mit dem ich jeden Tag mit dem "put" Befehl Dateien aus unterschiedlichen Quell-Ordnern auf einem SFTP Server hochlade.
Klappt auch soweit alles.

Es sind jeden Tag von 10 Ordner(gefüllt mit DOC Files) immer ein paar unterschiedliche Ordner ohne DOC Dateien vorhanden.

Nun zur eigentlichen Problemstellung:
Ich muss prüfen, ob immer alle Dateien hochgeladen worden sind.
Wie kann ich die Anzahl der erfolgreich hoch geladenen Dateien zählen?
Welche Anzahl richtig sein soll, kann ich ja mit dem Explorer über die Eigenschaften gegen prüfen...


In der Logdatei von WINSCP ist immer Exit Code 0 (also Fehler), da ja einige Ordner keine DOC Dateien enthalten.

In der Doku zu WINSCP habe ich nichts gefunden...

Kann jemand mir einen Denkanstoß geben?

Vielen Dank vorab!

Gruß
Werner

Content-Key: 595237

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

Printed on: April 19, 2024 at 19:04 o'clock

Member: it-fraggle
it-fraggle Aug 11, 2020 at 18:30:31 (UTC)
Goto Top
In der Logdatei von WINSCP ist immer Exit Code 0 (also Fehler), da ja einige Ordner keine DOC Dateien enthalten.
Wie kommst du darauf, dass Exit Code 0 = Fehler ist?

https://winscp.net/eng/docs/faq_script_result
Member: mbehrens
mbehrens Aug 11, 2020 at 22:06:15 (UTC)
Goto Top
Zitat von @werner1966:

Ich nutze WINSCP in der Console (mit Batchaufruf und script)
Ich habe ein Script erstellt, mit dem ich jeden Tag mit dem "put" Befehl Dateien aus unterschiedlichen Quell-Ordnern auf einem SFTP Server hochlade.
Klappt auch soweit alles.

Es sind jeden Tag von 10 Ordner(gefüllt mit DOC Files) immer ein paar unterschiedliche Ordner ohne DOC Dateien vorhanden.

Nun zur eigentlichen Problemstellung:
Ich muss prüfen, ob immer alle Dateien hochgeladen worden sind.
Wie kann ich die Anzahl der erfolgreich hoch geladenen Dateien zählen?

An diese Informationen kommt man meiner Meinung nach nur vernünftig, indem man das .NET Assembly von WinSCP z. B. per PS nutzt.

Welche Anzahl richtig sein soll, kann ich ja mit dem Explorer über die Eigenschaften gegen prüfen...


In der Logdatei von WINSCP ist immer Exit Code 0 (also Fehler), da ja einige Ordner keine DOC Dateien enthalten.

Das heißt ja, alles in Ordnung.

In der Doku zu WINSCP habe ich nichts gefunden...

Das steht dort eigentlich ganz gut beschrieben drin.
Member: maretz
maretz Aug 12, 2020 at 05:23:15 (UTC)
Goto Top
Ich würde schauen ob ich das über rsync abarbeiten kann. Hintergrund ist das dein reines "Dateizählen" nichts bringt. Was machst du wenn die Datei beim Kopieren beschädigt wurde? Dann hast du aufm Ziel ne 0-Byte-Datei aber natürlich würde dir dein Programm sagen "klar, hab ich ja kopiert".

Bei Rsync + Co hast du dagegen die Sicherheit das die Datei korrekt ankommt wenn du z.B. die MD5-Summen der Datei prüfst. Wenn der mitten drin abgebrochen is - resume und gut...

Wenn es schon Winscp sein muss würde ich etwas script-arbeit reinstecken und mir eben eine Text-File erzeugen was die Dateinamen + MD5-Summen enthält und auf dem Server dann dasselbe -> der muss halt prüfen ob die Dateien nach dem Kopieren alle da sind und passen, sonst halt irgendeine Aktion ausführen lassen (Mail an Admin, Selbstzerstörung des Servers, alles andere auch löschen - ganz wie du magst...)
Mitglied: 145033
145033 Aug 12, 2020 updated at 07:26:13 (UTC)
Goto Top
Jepp, checksum mukt dik dat

https://winscp.net/eng/docs/library_example_verify_file_checksum

Und hier noch mehr zum Thema
https://winscp.net/eng/docs/library_powershell

Also alles kein Hexenwerk.
Member: werner1966
werner1966 Aug 13, 2020 at 08:43:32 (UTC)
Goto Top
Hast natürlich recht, hatte mich verschrieben....also Code 1 = Fehler
Member: werner1966
werner1966 Aug 13, 2020 at 09:06:55 (UTC)
Goto Top
Zitat von @maretz:

Ich würde schauen ob ich das über rsync abarbeiten kann. Hintergrund ist das dein reines "Dateizählen" nichts bringt. Was machst du wenn die Datei beim Kopieren beschädigt wurde? Dann hast du aufm Ziel ne 0-Byte-Datei aber natürlich würde dir dein Programm sagen "klar, hab ich ja kopiert".
da habe ich nicht dran gedacht....hmmmm

Bei Rsync + Co hast du dagegen die Sicherheit das die Datei korrekt ankommt wenn du z.B. die MD5-Summen der Datei prüfst. Wenn der mitten drin abgebrochen is - resume und gut...

Wenn es schon Winscp sein muss würde ich etwas script-arbeit reinstecken und mir eben eine Text-File erzeugen was die Dateinamen + MD5-Summen enthält und auf dem Server dann dasselbe -> der muss halt prüfen ob die Dateien nach dem Kopieren alle da sind und passen, sonst halt irgendeine Aktion ausführen lassen (Mail an Admin, Selbstzerstörung des Servers, alles andere auch löschen - ganz wie du magst...)

--->WINSCP wäre schon gut, immerhin läuft es ja grundsätzlich.....wie gehe ich denn daran? Mir fehlt es an Script-Grundlagen...
Mitglied: 145033
145033 Aug 13, 2020 updated at 10:10:15 (UTC)
Goto Top
Einfaches Beispiel mit dem .NET Assembly in Powershell

(das GiveUpSecurityAndAcceptAnySshHostKey = $true ist nur für einen Test, ansonsten gehört das der Sicherheit ersetzt durch den tatsächlichen SHA256 FIngerprint des Zertifikats SshHostKeyFingerprint = 'xxxxxxxxxxxxxxxxxxxx')
Add-Type -Path ".\WinSCPnet.dll"  

$options = New-Object WinSCP.SessionOptions -Property @{
    Protocol = [WinSCP.Protocol]::Sftp
    Hostname = 'sftp.domain.tld'  
    Username = 'USERNAME'  
    Password = 'PASSWORD'  
    GiveUpSecurityAndAcceptAnySshHostKey = $true
}
# create session object
$session = New-Object WinSCP.Session

try{
    # open session
    $session.Open($options)
    # define transport options
    $transoptions = New-Object WinSCP.TransferOptions -Property @{Transfermode = [WinSCP.TransferMode]::Binary}
    # synchronize local to remote
    $result = $session.SynchronizeDirectories('Remote','D:\whereever','/remote/path',$false,$false,'Either')  
    # throw exceptions when there where errors
    $result.Check()
    $result
}catch{
    write-error -Message $_.Exception.Message
}finally{
    # cleanup
    $session.Close()
    $session.Dispose()
}
Member: werner1966
werner1966 Aug 17, 2020 at 09:23:14 (UTC)
Goto Top
Hallo kleiber,

Vielen dank für deine Rückmeldung.
Sorry, ich brauche noch mehr Anschub...face-wink

Was muss ich denn jetzt mit deinem o.g. Code machen?
Die Pfade anpassen ist klar,...und dann?
Meine Vermutung: Net Assembly installieren, Powershell in Windows aktivieren und deinen
Code als *.pi abspeichern. Start dann mit "namecode.pi"....

Ich danke Dir vorab,
Gruß

Werner
Mitglied: 145033
145033 Aug 17, 2020 updated at 10:57:39 (UTC)
Goto Top