Пакетный скрипт Windows для загрузки вчерашних файлов - PullRequest
2 голосов
/ 14 сентября 2011

Я пишу скрипт, использующий ftp.exe для загрузки файлов с FTP-сервера, он сначала работает.Но версия, которую я написал, подходила только для одного файла и текущей даты.Мой скрипт ниже:

echo user>>ftp.txt
echo password>>ftp.txt
set prefix=%date:~0,10%
set "name=%prefix%.txt"
echo get %name% >> ftp.txt
echo bye >> ftp.txt
ftp -s:ftp.txt ftpserver.com
del ftp.txt

Но теперь существует более одного файла с именами, такими как aa-bb-2011-09-13.0.log, aa-bb-2011-09-13.1.log, aa-bb-2011-09-13.10.log.Последний номер является серийным номером, это могут быть 0, 1, 2, 3 ...

Как можно было загрузить эти файлы с помощью пакетного сценария?Как изменить мой сценарий для загрузки более одного файла (номер неизвестен), который является шаблоном имени файла вчера?

Ответы [ 3 ]

3 голосов
/ 14 сентября 2011

С точки зрения загрузки нескольких файлов, используйте mget вместо get. Первый позволяет указывать шаблоны для получения, а не конкретные файлы.

Вам просто нужно создать «имя» с шаблоном подстановки и убедиться, что в вашем скрипте есть prompt до mget, в противном случае он будет запрашивать подтверждение для каждого файла.

Это не проверено, но это, вероятно, так же просто, как изменить:

echo get %name% >> ftp.txt

что-то вроде:

echo prompt>>ftp.txt
echo mget *%prefix%*>>ftp.txt

С точки зрения получения вчерашней даты вы можете использовать следующий скрипт. Это довольно сложно по сравнению с тем, что вы делаете, например, bash, но это работает.

@setlocal enableextensions enabledelayedexpansion
@echo off

rem Get the date from WMI (on one line).

for /f "skip=2 tokens=2-7 delims=," %%A in ('wmic 
        path win32_localtime get day^,month^,year^ /format:csv') do (
    set /a "yest_yyyy = %%C"
    set /a "yest_mm = %%B"
    set /a "yest_dd = %%A"
)

rem Not the first of the month, just decrement day.

if not %yest_dd%==1 (
    set /a yest_dd = yest_dd - 1
    goto done
)

rem Jan 1, set to Dec 31 previous year.

if %yest_mm%==1 (
    set /a "yest_dd = 31"
    set /a "yest_mm = 12"
    set /a "yest_yyyy = yest_yyyy - 1"
    goto :done
)

rem Any other day, decrement month.

set /a "yest_mm = yest_mm - 1"

rem Need to find last day, default to 31.

set dim=31

rem Apr/Jun/Sep/Nov all have 30 days. Feb gets special handling.

if %yest_mm%==4 set dim=30
if %yest_mm%==6 set dim=30
if %yest_mm%==9 set dim=30
if %yest_mm%==11 set dim=30
if not %yest_mm%==2 goto :got_dim

rem Default Feb to 28 then use rules to override.

set dim=28

set /a "divid=yest_yyyy%%400"
if "%divid%"=="0" goto daysinmonth_29days
set /a "divid=yest_yyyy%%100"
if "%divid%"=="0" goto :done
set /a "divid=yest_yyyy%%4"
if not "%divid%"=="0" goto :done

rem Adjust to 29 days.

:daysinmonth_29days

set dim=29

:done

rem Pad out and return value.

if %yest_mm% lss 10 set yest_mm=0%yest_mm%
if %yest_dd% lss 10 set yest_dd=0%yest_dd%

set yesterday=%yest_yyyy%-%yest_mm%-%yest_dd%

endlocal && set yesterday=%yesterday%

Будет установлена ​​переменная среды yesterday в формате YYYY-MM-DD, чтобы вы могли использовать ее в своем текущем скрипте. Просто вызовите call yesterday.cmd и затем используйте переменную окружения.

2 голосов
/ 11 июля 2016

Это довольно сложная задача для реализации с помощью пакетного файла Windows и встроенного FTP-клиента (ftp.exe).

Было бы проще с PowerShell.


И даже проще, если использовать более функциональный FTP-клиент, например, последнюю версию WinSCP FTP-клиент .

Если вы хотите загружать файлы на основе шаблона в имени файла, это поможет:

winscp.com /ini=nul /log=yesterday.log /command ^
    "open ftp://username:password@ftp.example.com/" ^
    "get /remote/path/*%%TIMESTAMP-1D#yyyy-mm-dd%%* C:\local\path\" ^
    "exit"

Используется синтаксис %TIMESTAMP%


Если вы хотите загружать файлы по времени модификации файла, используйте файл маска с временным ограничением :

winscp.com /ini=nul /log=yesterday.log /command ^
    "open ftp://username:password@ftp.example.com/" ^
    "get /remote/path/*>=yesterday<today C:\local\path\" ^
    "exit"

Синтаксис >=yesterday<today поддерживается WinSCP 5.15 и новее.

В старых версиях WinSCPВы можете снова использовать %TIMESTAMP% синтаксис , в частности >=%%TIMESTAMP-1D#yyyy-mm-dd%%<%%TIMESTAMP#yyyy-mm-dd%%, вместо >=yesterday<today.

(я автор WinSCP)

0 голосов
/ 15 сентября 2011

Это пример FTP-скрипта, который делает почти то, что вам нужно, но использует сторонний клиент вместо того, который поставляется бесплатно с Windows: http://kb.robo -ftp.com / script_library / show / 45

Может быть, вы можете преобразовать его.

...