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.csv
do dia anterior para um destino fixo.
Por exemplo, hoje é 16 de setembro de 2015: quero fazer FTP files.csv
do 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 scp
uma 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 date
com 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, ftp
você pode mesclar o que está acima comesta resposta.