1

Тема: CMD/BAT: Циклическая передача нескольких команд.

Здравствуйте!
Нужна помощь!

У меня вопрос:

Есть у меня bat файл, который коннектится на FTP сервер

@Echo off
ftp -s:ftp_command.txt -i 93.189.41.9
pause


Задача следующая:

Хочу после коннекта на ftp сервер, постоянно отправлять команду GET FileName.ini D:\FileName.ini

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

При нахождение файла и загрузки её на соответствующий путь - удалять из сервера командой Delete FileName.ini

И снова начинать циклический поиск GET FileName.ini D:\FileName.ini

P.S

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

GET FileName.ini D:\FileName.ini
Delete FileName.ini

Как создать цикл ввод этих команд?

Люблю когда мне понижают репутацию (мне правда все равно)

2

Re: CMD/BAT: Циклическая передача нескольких команд.

baplo пишет:

Как создать цикл ввод этих команд?

Бесконечный цикл:

for /l %%a in (0,0,0) do (
	ftp -s:ftp_command.txt -i 93.189.41.9
	ping -n 3 127.0.0.1
)

В ftp_command.txt добавляем команды скачки и удаления:

baplo пишет:

GET FileName.ini D:\FileName.ini
Delete FileName.ini

ping нужен для небольшой задержки перед повторным подключением.

+ Offtopic

Я бы сделал запуск скрипта:

ftp -s:ftp_command.txt -i 93.189.41.9

из планировщика, например, каждые 5-10 минут.

Если заранее имя файла на FTP-сервере неизвестно, сначала придётся подключаться к серверу, забирать листинг корня (если есть поддиректории, также в цикле переподключаться и получать листинги поддиректорий), получать имя нужного файла (например, по маске) и формировать список команд для скачки и удаления нужного.

Честно говоря, лучше для таких целей поискать любой другой ftp-клиент с более широкими возможностями.

Для примера приведу скрипт, который проверял public FTP adobe.com и выкачивал оттуда рекурсивно acrobat reader и патчи к нему.
!!! Achtung !!! при первом запуске скрипт выкачает неск. гигов!


@ECHO OFF & SETLOCAL ENABLEEXTENSIONS

SET FTP_SERVER=ftp.adobe.com
SET FTP_LOGIN=anonymous
SET FTP_PASS=anonymous@example.com
SET TEMP=%CD%

IF NOT EXIST %TEMP%\%~n0 MD %TEMP%\%~n0
PUSHD %TEMP%\%~n0

SET FTP_CMD_FILE=ftp_cmd_file
SET FTP_LIST_FILE=ftp_list_file

SET REMPATH=pub/adobe/reader/win/11.x
SET LCLPATH=%TEMP%\%~n0
CALL :CONNECT %REMPATH% %LCLPATH%

FOR /F "tokens=9" %%a IN ('TYPE dirs.txt') DO (
	IF NOT EXIST %LCLPATH%\%%a MD %LCLPATH%\%%a
    CALL :CONNECT %REMPATH%/%%a %LCLPATH%\%%a
    IF EXIST "%LCLPATH%\%%a\dirs.txt" (
    	FOR /F "tokens=9" %%b IN ('TYPE %LCLPATH%\%%a\dirs.txt') DO (
			IF NOT EXIST %LCLPATH%\%%a\%%b MD %LCLPATH%\%%a\%%b
		    CALL :CONNECT %REMPATH%/%%a/%%b %LCLPATH%\%%a\%%b
    	)

    )
)

SETLOCAL ENABLEDELAYEDEXPANSION
FOR /f %%a IN ('DIR /B/S/A-D %TEMP%\%~n0\*get.txt^|FINDSTR.EXE /C:"\\ru_RU\\" /C:"\\en_US\\" /C:"\\misc\\" /C:"\\AppV\\"') do (
	ECHO %%a >> %LCLPATH%\get.lst
)

FOR /F %%a IN ('type %LCLPATH%\get.lst^|SORT') DO (
	FOR /F "tokens=9" %%b IN ('TYPE %%a') DO (
		SET _RMTDIR=%%~dpa
        IF "!_RMTDIR:~-1!" == "\" (
			set _RMTDIR=!_RMTDIR:~0,-1!
        )
        SET _RMTDIR=!_RMTDIR:%LCLPATH%\=!
        SET _RMTDIR=!_RMTDIR:\=/!
        CALL :GETFILE %REMPATH%/!_RMTDIR! %TEMP%\GET\!_RMTDIR:/=\! %%b
	)
)

POPD
EXIT /B 0 & ENDLOCAL

:CONNECT
IF NOT EXIST %2 MD %2
ECHO.open %FTP_SERVER%>%FTP_CMD_FILE%
ECHO.%FTP_LOGIN%>>%FTP_CMD_FILE%
ECHO.%FTP_PASS%>>%FTP_CMD_FILE%
ECHO.verbose>>%FTP_CMD_FILE%
ECHO.binary>>%FTP_CMD_FILE%
ECHO.cd %1>>%FTP_CMD_FILE%
ECHO.lcd %2>>%FTP_CMD_FILE%
ECHO.dir . %FTP_LIST_FILE%>>%FTP_CMD_FILE%
ECHO.quit>>%FTP_CMD_FILE%

FTP.EXE -s:"%FTP_CMD_FILE%"

(TYPE %2\%FTP_LIST_FILE%|FINDSTR.EXE "^d." 2>&1 >nul) && (TYPE %2\%FTP_LIST_FILE%|FINDSTR.EXE "^d." > %2\dirs.txt)
(TYPE %2\%FTP_LIST_FILE%|FINDSTR.EXE "^-r." 2>&1 >nul) && (TYPE %2\%FTP_LIST_FILE%|FINDSTR.EXE "^-r." > %2\files.txt)
IF EXIST %2\files.txt (
	(TYPE %2\files.txt|FINDSTR.EXE /r /i /C:".ms[ip]" /C:".exe" /C:".zip" /C:".cab" 2>&1 >nul) && (TYPE %2\files.txt|FINDSTR.EXE /r /i /C:".ms[ip]" /C:".exe" /C:".zip" /C:".cab" > %2\get.txt)
)

EXIT /B 0

:GETFILE
IF NOT EXIST %2\%3 (
	IF NOT EXIST %2 MD %2
	ECHO.open %FTP_SERVER%>%FTP_CMD_FILE%
	ECHO.%FTP_LOGIN%>>%FTP_CMD_FILE%
	ECHO.%FTP_PASS%>>%FTP_CMD_FILE%
	ECHO.verbose>>%FTP_CMD_FILE%
	ECHO.binary>>%FTP_CMD_FILE%
	ECHO.cd %1>>%FTP_CMD_FILE%
	ECHO.lcd %2>>%FTP_CMD_FILE%
	ECHO.get %3>>%FTP_CMD_FILE%
	ECHO.quit>>%FTP_CMD_FILE%
    
	FTP.EXE -s:"%FTP_CMD_FILE%"
)
EXIT /B 0