Ich habe eine Reihe von Verzeichnissen, in deren Namen das Datum kodiert ist.
In diesen Verzeichnissen befinden sich Dateien mit dem Namen files.csv
.
Die Verzeichnisse haben einen Standardnamen wie zum Beispiel
/opt/oss/server/var/fileint/pm/pmexport_20150915
wobei sich der Name des letzten Verzeichnisses täglich ändert, zB pmexport_20150915
das Verzeichnis vom 15. September 2015.
Ich möchte eine Batchdatei erstellen, um die Daten files.csv
des Vortags automatisch per FTP an ein festes Ziel zu senden.
Heute ist beispielsweise der 16. September 2015: Ich möchte per FTP files.csv
aus dem Verzeichnis von gestern senden pmexport_20150915
.
Antwort1
Hast du gesehenDasPost zum Hochladen von Dateien mit Powershell?
#####################################################################################
## Script will Upload files to FTP
## Author: Vikas Sukhija
##
## Date: 02-24-2013
## Modified Date:- 02-26-2013 (included loging & monitoring)
#####################################################################################
#############################Define Log Files########################################
$date = get-date -format d
$date = $date.ToString().Replace(“/”, “-”)
$time = get-date -format t
$month = get-date
$month1 = $month.month
$year1 = $month.year
$time = $time.ToString().Replace(":", "-")
$time = $time.ToString().Replace(" ", "")
$log1 = ".\Logs" + "\" + "FTP_" + $date + "_.log"
$log2 = ".\Logs" + "\" + "FTP_" + $month1 +"_" + $year1 +"_.log"
$log3 = ".\Logs" + "\" + "FTP_" + $date + $time + "_.log"
$logs = ".\Logs" + "\" + "Powershell" + $date + "_" + $time + "_.txt"
#Start-Transcript -Path $logs
$dt = Get-Date
Add-Content $log3 "$dt : Script Started"
###########################Variables######################################
$smtpServer = "smtp.lab.com" # Change
$fromadd = "[email protected]" # Change
$email1 = "[email protected]" # Change
$ftp = "ftp://127.0.0.1/" # Change
$user = "vikas" # Change
$pass = "password" # Change
$uploadfpath = "C:\Uploadftp\ftpfiles" # Define the Folder from where files will be uploaded
###########################################################################
$checkitems = Get-ChildItem $uploadfpath
$countitems = $checkitems.count
if ($countitems -eq 0)
{
Write-Host "No items to process" -ForegroundColor Green
$dt = Get-Date
Add-Content $log3 "$dt : No items to process, script will exit"
exit
}
$dt = Get-Date
Add-Content $log3 "$dt : Total number of items to process $countitems"
$processed = ".\processed\$date" + "-" + $time
if((test-path $processed) -like $false)
{
New-Item -Path "$processed" -type directory
}
#####################################################################################
if ($error -ne $null)
{
#SMTP Relay address
$msg = new-object Net.Mail.MailMessage
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
#Mail sender
$msg.From = $fromadd
#mail recipient
$msg.To.Add($email1)
$msg.Subject = "FTP Script error"
$msg.Body = $error
$smtp.Send($msg)
$dt = Get-Date
Add-Content $log3 "$dt : Script Terminated because of error: $error"
$error.clear()
exit
}
else
{
Write-host "no errors till now"
}
$webclient = New-Object System.Net.WebClient
$webclient.Credentials = New-Object System.Net.NetworkCredential($user,$pass)
#Upload each file in upload directory...
foreach($item in (dir $uploadfpath "*.*")){
Write-host "Uploading $item..." -ForegroundColor Green
$dt = Get-Date
Add-Content $log3 "$dt : Uploading $item..."
$uri = New-Object System.Uri($ftp+$item.Name)
$webclient.UploadFile($uri, $item.FullName)
if($error -ne $null)
{
Write-Host "Items will not be moved" -ForegroundColor Red
}
else
{
Write-Host "Moving $item to processed" -ForegroundColor green
Move-Item "$uploadfpath\$item" $processed
$dt = Get-Date
Add-Content $log3 "$dt : Moving $item to processed"
}
}
if ($error -ne $null)
{
#SMTP Relay address
$msg = new-object Net.Mail.MailMessage
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
#Mail sender
$msg.From = $fromadd
#mail recipient
$msg.To.Add($email1)
$msg.Subject = "FTP Script error"
$msg.Body = $error
$smtp.Send($msg)
$dt = Get-Date
Add-Content $log3 "$dt : Script encountered error: $error"
$error.clear()
}
else
{
Write-host "no errors till now"
}
$dt = Get-Date
Add-Content $log3 "$dt : Script Processing finished"
#Stop-Transcript
##################################################################
Sie müssen lediglich eine Zeichenfolge erstellen, die die Dateien enthält, die Sie aktualisieren möchten. Wenn Sie die Funktion Get-Date folgendermaßen verwenden:
(Get-Date).AddDays(-1).ToString('yyyyMMdd'),
können Sie ein Zeichenfolgenarray erstellen, das die Dateien enthält, die Sie hochladen möchten. Dies sollte möglich sein, indem Sie das get-childitem so ändern, dass ein Filter für die Zeichenfolge enthalten ist.
Ich kann dies nicht vollständig kompilieren und für Sie testen, da ich keinen FTP zum Überprüfen und nur begrenzte Zeit habe, aber hoffentlich funktioniert es mit einer kleinen Optimierung problemlos.
Antwort2
Nehmen wir an, Sie möchten die Dateienvon einer Linux-Maschine. Die Schritte, die Sie ausführen müssen, sind dieselben, egal ob Sie eine Bash-Shell oder eine Powershell programmieren müssen, nur die Sprache ist anders ... selten fehlt in einer Sprache das Wort (der Befehl), das Sie benötigen, und Sie müssen andere verwenden.
Ich werde Ihnen keine vollständig funktionierende Lösung geben, ich werde eine verwenden, scp
die eine sichere Kopie erstellt (es ist ein Remote-Dateikopierprogramm). Betrachten Sie es als Hinweise und als einen Befehl, den Sie nützlich finden (tun Sie es man date
für die Hilfe von date
...).
#!/bin/bash
DestinationPath="/tmp" # Here you have to put where you want to copy the file
FileToTake='files.csv' # Here the file you want to take
PathFrom=$(date -d yesterday "+/opt/oss/server/var/fileint/pm/pmexport_%Y%m%d")
FullFileNameToTake="${PathFrom}/${FileToTake}"
scp -p user@host:"$FullFileNameToTake" "$DestinationPath"
Wenn Sie verwenden möchten, ftp
können Sie das oben genannte mit zusammenführendiese Antwort.