У меня есть набор каталогов с закодированной в их именах датой.
Внутри этих каталогов есть файлы с именами files.csv
.
Каталоги имеют стандартное имя, например,
/opt/oss/server/var/fileint/pm/pmexport_20150915
где имя последнего каталога меняется в зависимости от дня, например, pmexport_20150915
это каталог от 15 сентября 2015 года.
Я хотел бы создать пакетный файл для автоматического ftp files.csv
предыдущего дня в фиксированное место назначения.
Например, сегодня 16 сентября 2015 года: я хочу ftp files.csv
из вчерашнего каталога, pmexport_20150915
.
решение1
Ты виделэтотпост о загрузке файлов с помощью 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
##################################################################
Все, что вам нужно создать, это строку, которая содержит файлы, которые вы хотите обновить. Если вы используете функцию Get-Date следующим образом:
(Get-Date).AddDays(-1).ToString('yyyyMMdd')
Тогда вы сможете создать массив строк, содержащий ваши файлы, которые вы хотите загрузить. Вы должны иметь возможность сделать это, изменив get-childitem, чтобы включить фильтр в строку.
Я не могу полностью скомпилировать это и протестировать это для вас, так как у меня нет FTP, чтобы проверить это, и ограниченное количество времени, но надеюсь, что с небольшой настройкой вы заставите это работать нормально.
решение2
Предположим, что вы хотите взять файлыс машины Linux. Действия, которые вам нужно выполнить, одинаковы, если вам нужно запрограммировать оболочку bash или powershell, отличается только язык... редко бывает так, что в языке нет нужного вам слова (команды), и вам приходится использовать другие.
Я не дам вам полностью работающее решение, я буду использовать scp
то, что делает безопасную копию (это программа удаленного копирования файлов). Примите это как подсказки и какую-то команду, которая может оказаться полезной (сделайте man date
для помощи 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"
если вы хотите использовать, ftp
вы можете объединить то, что выше, сэтот ответ.