Como criar um arquivo em lote para arquivos FTP no diretório com o nome relacionado a ontem?

Como criar um arquivo em lote para arquivos FTP no diretório com o nome relacionado a ontem?

Eu tenho um conjunto de diretórios com a data codificada em seus nomes.
Dentro desses diretórios existem arquivos chamados files.csv.

Os diretórios têm um nome padrão como, por exemplo,

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

onde o nome do último diretório muda com o dia, por exemplo, pmexport_20150915é o diretório de 15 de setembro de 2015.

Gostaria de criar um arquivo em lote para FTP automaticamente files.csvdo dia anterior para um destino fixo.
Por exemplo, hoje é 16 de setembro de 2015: quero fazer FTP files.csvdo diretório de ontem, pmexport_20150915.

Responder1

Você viuessepostar sobre upload de arquivos com 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 
##################################################################

Tudo que você precisa criar é uma string que contém os arquivos que você deseja atualizar. Se você usar a função Get-Date desta forma:
(Get-Date).AddDays(-1).ToString('yyyyMMdd')
Então você poderá criar uma matriz de string contendo os arquivos que deseja enviar. Você deve conseguir fazer isso modificando get-childitem para incluir um filtro na string.
Não posso compilar isso totalmente e testá-lo para você, pois não tenho FTP para verificar e estou limitado, mas espero que com um ajuste rápido você faça com que funcione bem.

Responder2

Suponhamos que você queira pegar os arquivosde uma máquina Linux. Os passos que você deve seguir são os mesmos se você tiver que programar um shell bash ou um powershell, apenas a linguagem é diferente... raramente em uma linguagem não existe a palavra (comando) que você precisa e você tem que usar outras.

Não vou te dar uma solução completa e funcional, vou usar scpuma que faça uma cópia segura (é um programa de cópia remota de arquivos). Considere isso como dicas e algum comando que você possa achar útil (faça man datecom a ajuda 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"

se você quiser usar, ftpvocê pode mesclar o que está acima comesta resposta.

informação relacionada