PS Script - WinSCP und Datei kopieren
Hallo,
ich möchte gerne ein CMD Script umschreiben in Powershell und erweitern.
Mein CMD hat ein WinSCP aufruf gemacht, das lief bisher auch Fehlerfrei.
Nun möchte ich das umbauen in Powershell
CMD-Aufruf:
Powershellaufruf:
Hier habe ich das Problem, dass die $dat nicht korrekt ausgegeben wird. winscp meldet den Fehler, dass keine Log in \logs geschrieben werden kann (logisch wenn kein weiterer Dateiname da ist).
Wenn das winscp durch ist, würde ich gerne Dateien von einem Verzeichnis ins andere kopieren, die nicht älter als einen Tag sind.
WinSCP macht einen kompletten FTP Verzeichnis Sync. Den FTP Inhalt kann ich nicht beeinflussen. Er beinhaltet leider auch ältere Dateien.
das funktioniert auch ohne Probleme.
Nun zu den Fragen:
1. Wie komme ich aus dem Fehler beim WinSCP raus dass er mir die log richtig schreibt?
2. Gibt es beim kopieren der neuen Dateien in den Ordnern einen schöneren Weg? Bei dem Punkt Firma habe ich 5 stück und jeweils zwei Unterordner. (Ich fürchte es gibt dafür einen einzeiler... :D )
Hoffe ich habe mich verständlich ausgedrückt.
Gruß
ich möchte gerne ein CMD Script umschreiben in Powershell und erweitern.
Mein CMD hat ein WinSCP aufruf gemacht, das lief bisher auch Fehlerfrei.
Nun möchte ich das umbauen in Powershell
CMD-Aufruf:
SET dati=%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%-%TIME:~0,2%.%TIME:~3,2%
"C:\Program Files (x86)\WinSCP\winscp.exe" -filezilla Download /script="F:\Downloadscripte\download.txt" /log="F:\Downloadscripte\logs\%dati%.log
Powershellaufruf:
$dat=(get-date -format "yyyyMMdd-hh.mm")
$wscp_par="-filezilla ","Download /script=","F:\Downloadscripte\download.txt ","/log=F:\Downloadscripte\logs\",$dat,".log"
& 'C:\Program Files (x86)\WinSCP\WinSCP.exe' $wscp_par
Hier habe ich das Problem, dass die $dat nicht korrekt ausgegeben wird. winscp meldet den Fehler, dass keine Log in \logs geschrieben werden kann (logisch wenn kein weiterer Dateiname da ist).
Wenn das winscp durch ist, würde ich gerne Dateien von einem Verzeichnis ins andere kopieren, die nicht älter als einen Tag sind.
WinSCP macht einen kompletten FTP Verzeichnis Sync. Den FTP Inhalt kann ich nicht beeinflussen. Er beinhaltet leider auch ältere Dateien.
gci "F:\DLT\download\Firma\massdata" | Where-Object {$_.LastWriteTime -gt (Get-Date).AddDays(-2)} | % { copy-item $_.FullName "F:\DLT\automatisch\Firma\massdata"}
gci "F:\DLT\download\Firma\drivercards" | Where-Object {$_.LastWriteTime -gt (Get-Date).AddDays(-2)} | % { copy-item $_.FullName "F:\DLT\automatisch\Firma\drivercards"}
Nun zu den Fragen:
1. Wie komme ich aus dem Fehler beim WinSCP raus dass er mir die log richtig schreibt?
2. Gibt es beim kopieren der neuen Dateien in den Ordnern einen schöneren Weg? Bei dem Punkt Firma habe ich 5 stück und jeweils zwei Unterordner. (Ich fürchte es gibt dafür einen einzeiler... :D )
Hoffe ich habe mich verständlich ausgedrückt.
Gruß
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 6286810456
Url: https://administrator.de/forum/ps-script-winscp-und-datei-kopieren-6286810456.html
Ausgedruckt am: 24.12.2024 um 18:12 Uhr
18 Kommentare
Neuester Kommentar
Hallo, so auf die schnelle die Frage: Warum gehst du über Command-Line und bindest nicht die DLL ein?
https://winscp.net/eng/docs/library_powershell
Da bekommt man die Ergebnisse auch gleich im Objekt mit
Und kann die dann selber an eine Log anhängen etc.
Wegen einfach Abgleich: https://winscp.net/eng/docs/library_session_synchronizedirectories
Du könntest auch hier einfach die Sync Mehtoden anwenden. Gibt auch da ein PS Beispiel. Wäre das nicht einfacher?
PS:
https://winscp.net/forum/viewtopic.php?t=24945
Da wird der Exclude nochmals erklärt. Mit Filemask kannst du Ordner ausschließen.
Beim Sync heisst es ja: Transfer options. Defaults to null, what is equivalent to new TransferOptions().
Du kannst also die Klasse der Transferoptionen einfach mit reinnehmen und die Sache rund machen.
https://winscp.net/eng/docs/library_transferoptions
https://winscp.net/eng/docs/library_powershell
Da bekommt man die Ergebnisse auch gleich im Objekt mit
foreach ($transfer in $transferResult.Transfers)
Und kann die dann selber an eine Log anhängen etc.
Wegen einfach Abgleich: https://winscp.net/eng/docs/library_session_synchronizedirectories
Du könntest auch hier einfach die Sync Mehtoden anwenden. Gibt auch da ein PS Beispiel. Wäre das nicht einfacher?
PS:
https://winscp.net/forum/viewtopic.php?t=24945
Da wird der Exclude nochmals erklärt. Mit Filemask kannst du Ordner ausschließen.
Beim Sync heisst es ja: Transfer options. Defaults to null, what is equivalent to new TransferOptions().
Du kannst also die Klasse der Transferoptionen einfach mit reinnehmen und die Sache rund machen.
https://winscp.net/eng/docs/library_transferoptions
Naja Logik kann dann helfen!
Durch den remote Hotfolder und das verschieben verlieren wir den Focus. Sync würde dann alles nochmal kopieren. Man kann die übertragenen Dateien an eine CSV anhängen und die zum Ausschließen nehmen. Oder aber man verschiebt die Dateien lokal ebenfalls - anhand des remote Backup Ordners - und hat die so dann außen vor.
Das verstehe ich gerade nicht ganz. Du meinst die im Backup Ordner oder welche? Dachte die übertragenen müssen liegen bleiben, damit der Import über das Programm funktioiert. Dan weglöschen.... Die liegen dann ja eh nich mehr im primären Transfer-Ziel.
https://winscp.net/eng/docs/library_example_delete_after_successful_down ...
Erfolgskontrolle auch hier ganz einfach. Ist nur die andere Richtung. Alles mit Success wird gelöscht. Aber erklär nochmal, was gelöscht werden soll.
Transfer
lokal -> FTP
löschern aller ERFOLGREICH übertragenen Dateien LOKAL
Meinst du das so?
Durch den remote Hotfolder und das verschieben verlieren wir den Focus. Sync würde dann alles nochmal kopieren. Man kann die übertragenen Dateien an eine CSV anhängen und die zum Ausschließen nehmen. Oder aber man verschiebt die Dateien lokal ebenfalls - anhand des remote Backup Ordners - und hat die so dann außen vor.
Zitat von @killtec:
Nachtrag: Noch schöner wäre es, wenn erfolgreich übertragene Dateien vom FTP gelöscht werden könnten.
Aber hier hab ich leider keinen Plan wie man das automatisieren kann.
Nachtrag: Noch schöner wäre es, wenn erfolgreich übertragene Dateien vom FTP gelöscht werden könnten.
Aber hier hab ich leider keinen Plan wie man das automatisieren kann.
Das verstehe ich gerade nicht ganz. Du meinst die im Backup Ordner oder welche? Dachte die übertragenen müssen liegen bleiben, damit der Import über das Programm funktioiert. Dan weglöschen.... Die liegen dann ja eh nich mehr im primären Transfer-Ziel.
https://winscp.net/eng/docs/library_example_delete_after_successful_down ...
Erfolgskontrolle auch hier ganz einfach. Ist nur die andere Richtung. Alles mit Success wird gelöscht. Aber erklär nochmal, was gelöscht werden soll.
Transfer
lokal -> FTP
löschern aller ERFOLGREICH übertragenen Dateien LOKAL
Meinst du das so?
Jo stimmt, dachte wir reden nur von lokal und FTP. Das die App auf den FTP Ordner zugreift. So wird es deutlicher. Ich war davon ausgegangen, dass der Hotfolder für die App auch auf dem FTP liegt Darum etwas komisch.
Und welche Datein auf den FTP sollen gelöscht werden? Nur die hochgeladenen? Oder gar alle? Da steig ich noch nicht ganz hinter!
Und welche Datein auf den FTP sollen gelöscht werden? Nur die hochgeladenen? Oder gar alle? Da steig ich noch nicht ganz hinter!
Moin,
Versuch es mal mit:
Gruß Thomas
Zitat von @killtec:
da sind mehrere Fehler drin. Zum einen hast du ein Leerzeichen hinter der download.txt, welches einen Fehler verursachen dürfte. Zudem kannst du bei der Log natürlich nicht einfach Pfad, Dateinamen und Erweiterung voneinander trennen.$wscp_par="-filezilla ","Download /script=","F:\Downloadscripte\download.txt ","/log=F:\Downloadscripte\logs\",$dat,".log"
Versuch es mal mit:
$wscp_par="-filezilla","Download","/script=""F:\Downloadscripte\download.txt""","/log=""F:\Downloadscripte\logs\$dat.log"""
Gruß Thomas
Also CSV kann man hernehmen oder mit gci die Items aus Erfolg holen. $_.Basname o.ä. als vergleich, damit genau die nicht nochmal kopiert werden.
Nur irgendwann ist alles vollgemüllt. Mit CSV kann man auch mal die Referenzen in Erfolgreich weglöschen und hat - falls der FTP die Dateien der letzten 10 Jahre auspuckt - immer noch was zum Vergleich.
E-Mail ja, aber ggf. nur im Fehlerfall an euer Ticketsystem. Große Dateien anhängen ist auch unschön - File Liste sollte da reichen.
Syncen ist vlt. auch zu viel. Es reicht wenn nur die letzten 2-5 Tage geladen werden. Ist das sauber entweder sofort oder später den FTP leeren. Längerer Zeitraum als Puffer/ Fehlertoleranz. Dann die Dateien in den Hotfolder für die App schieben und parallel CSV als Logfile führen. Dient später auch als Exclusion für bereits kopierte Dateien.
Wenn dir das File-Limit bekannt ist, kannst du die Dateien auch vorher schon aussortieren. Zu Große Dateien bekommt die App da gar nicht erst zu sehen. Du weißt ja eh schon was sonst damit passiert.
Hab leider grad keine FTP hier. Sonst würd ich das mal durchknallen.
Brauchen wir filezilla überhaupt? Frage ist, hast du die Credentials oder müssen wir die aus Filezila holen? Sollte ja Base64 encodiert sein. Heisst sollte man auch auslesen können ... Dann wäre der Krams mit Filezilla mal komplett weg.
Nur irgendwann ist alles vollgemüllt. Mit CSV kann man auch mal die Referenzen in Erfolgreich weglöschen und hat - falls der FTP die Dateien der letzten 10 Jahre auspuckt - immer noch was zum Vergleich.
E-Mail ja, aber ggf. nur im Fehlerfall an euer Ticketsystem. Große Dateien anhängen ist auch unschön - File Liste sollte da reichen.
Syncen ist vlt. auch zu viel. Es reicht wenn nur die letzten 2-5 Tage geladen werden. Ist das sauber entweder sofort oder später den FTP leeren. Längerer Zeitraum als Puffer/ Fehlertoleranz. Dann die Dateien in den Hotfolder für die App schieben und parallel CSV als Logfile führen. Dient später auch als Exclusion für bereits kopierte Dateien.
Wenn dir das File-Limit bekannt ist, kannst du die Dateien auch vorher schon aussortieren. Zu Große Dateien bekommt die App da gar nicht erst zu sehen. Du weißt ja eh schon was sonst damit passiert.
Hab leider grad keine FTP hier. Sonst würd ich das mal durchknallen.
Brauchen wir filezilla überhaupt? Frage ist, hast du die Credentials oder müssen wir die aus Filezila holen? Sollte ja Base64 encodiert sein. Heisst sollte man auch auslesen können ... Dann wäre der Krams mit Filezilla mal komplett weg.
Fuhrpark und du wilslt euren Wagenmeister eine Freude machen?
$root = "F:\DLT"
$companies = "Firma1","Firma2"
$subfolders = "massdata","drivercards"
foreach($company in $companies){
foreach($subfolder in $subfolders){
Get-ChildItem "$root\download\$company\$subfolder" -File -Filter *.ddd | ?{$_.LastWriteTime -gt (Get-Date).Date.AddDays(-2)} | copy-item -Destination (md "$root\automatisch\$company\$subfolder" -Force).Fullname
}
}
$root = "F:\DLT"
Get-ChildItem "$root\download\*\*" -Directory | %{Get-ChildItem $_.Fullname -File -Filter *.ddd | ?{$_.LastWriteTime -gt (Get-Date).Date.AddDays(-2)} | copy-item -Destination {(md "$root\automatisch\$($_.Directory.Parent.Name)\$($_.Directory.Name)" -Force).Fullname}}
Ohne Anmeldung sind keine Netzlaufwerke verbunden. Benutze besser UNC Pfade.
Gibt es noch eine Möglichkeit das zu debuggen?
Start-Transcript