¿Cómo crear un archivo por lotes para archivos ftp en el directorio con el nombre relacionado con ayer?

¿Cómo crear un archivo por lotes para archivos ftp en el directorio con el nombre relacionado con ayer?

Tengo un conjunto de directorios con la fecha codificada en sus nombres.
Dentro de esos directorios hay archivos llamados files.csv.

Los directorios tienen un nombre estándar como, por ejemplo,

/opt/oss/server/var/fileint/pm/pmexport_20150915

donde el nombre del último directorio cambia con el día, por ejemplo, pmexport_20150915es el directorio del 15 de septiembre de 2015.

Me gustaría crear un archivo por lotes para enviar automáticamente por ftp el files.csvdel día anterior a un destino fijo.
Por ejemplo, hoy es 16 de septiembre de 2015: quiero ftp files.csvdesde el directorio de ayer pmexport_20150915.

Respuesta1

Haz vistoeste¿publicar sobre cómo cargar archivos con 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 
##################################################################

Todo lo que necesita crear es una cadena que contenga los archivos que desea actualizar. Si usa la función Get-Date de esta manera:
(Get-Date).AddDays(-1).ToString('yyyyMMdd')
Entonces podrá crear una matriz de cadenas que contenga los archivos que desea cargar. Debería poder hacer esto modificando get-childitem para incluir un filtro en la cadena.
No puedo compilar esto completamente y probarlo porque no tengo FTP para verificarlo y tengo un volumen limitado, pero espero que con un ajuste rápido lo tengas funcionando bien.

Respuesta2

Supongamos que quieres tomar los archivos.desde una máquina Linux. Los pasos que tienes que hacer son los mismos si tienes que programar un bash shell o un powershell, solo que el idioma es diferente... rara vez en un idioma no está la palabra (comando) que necesitas y tienes que usar otras.

No les daré una solución que funcione completamente, usaré scpla que hace una copia segura (es un programa de copia remota de archivos). Tómelo como sugerencias y algún comando que pueda resultarle útil (hágalo man datecon la ayuda de 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"

Si quieres usarlo, ftppuedes fusionar lo anterior conesta respuesta.

información relacionada