Wie erstelle ich eine Batchdatei zum FTP-Versand von Dateien im Verzeichnis mit dem Namen von gestern?

Wie erstelle ich eine Batchdatei zum FTP-Versand von Dateien im Verzeichnis mit dem Namen von gestern?

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_20150915das Verzeichnis vom 15. September 2015.

Ich möchte eine Batchdatei erstellen, um die Daten files.csvdes Vortags automatisch per FTP an ein festes Ziel zu senden.
Heute ist beispielsweise der 16. September 2015: Ich möchte per FTP files.csvaus 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, scpdie 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 datefü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, ftpkönnen Sie das oben genannte mit zusammenführendiese Antwort.

verwandte Informationen