Я пытаюсь создать командный файл в первый раз. Это будет для загрузки файла, который обновляется раз в неделю с новым идентификатором. Это командный файл, который я создал до сих пор -

@echo off
echo open SERVER> temp.txt
echo USERNAME>> temp.txt
echo PWD>> temp.txt
echo cd />> temp.txt
echo cd Events/_PPV_Barker>> temp.txt
echo binary>> temp.txt
echo get Barker*_480i.ts>> temp.txt 
ftp -s:temp.txt
del temp.txt

Я знаю, что каждый раз, когда новый файл будет загружен на сервер, именем файла будет Barker а имя файла будет заканчиваться 480i.ts Я пытался *, как показано выше, но это не работает. Как я могу использовать команду if, чтобы каждый раз получать файл с уникальным идентификатором? или есть какой-то другой способ, кроме команды if?

Любая помощь будет оценена.

Спасибо

Кешав

4 ответа4

1

Если вы хотите поместить свой пароль и имя пользователя в сценарий (в виде обычного текста!) тогда вы не должны возражать против использования их в самой командной строке.

Если вы сохраняете локальные копии старых файлов после их загрузки и не изменяете их или их временные метки, вы можете исключить идею всего пакетного файла, используя wget для Windows, и включить параметр --timestamping . Это позволит сравнить размер и временную метку локальных файлов с удаленными файлами, загружая только удаленные файлы, если один из них отличается или локальный файл не существует. В качестве дополнительного преимущества, если вы пропустили предыдущие обновления, будут загружены все новые файлы, а не только самые новые.

Ваша командная строка будет выглядеть примерно так:

`wget --ftp-user=<user> --ftp-password=<password> --timestamping ftp://example.com/Events/_PPV_Barker/Barker*_480i.ts`

Конечно, это предполагает, что у вас есть необходимые привилегии для установки wget, и что вы сохраняете предыдущие копии локально.

1

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

В простейшем случае, это только один файл, и здесь ваше решение почти правильное: необходимо одно простое изменение, чтобы заменить get на mget , когда подстановочный знак * будет работать:

echo mget Barker*_480i.ts>> temp.txt

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

Если у вас есть полный доступ к удаленному каталогу, вы можете удалить, переместить или переименовать загруженный файл на удаленном компьютере, чтобы каждый раз у вас был только один файл, соответствующий маске файла.

Если вы не можете сделать ничего из этого, вам понадобятся два вызова ftp : первый получит список каталогов с пульта, который вы затем сравните с вашим предыдущим списком удаленных, чтобы вы могли затем определить новый файл и создайте второй вызов ftp чтобы получить его. Пакетный файл для этого будет нелегко написать, но это возможно - я делаю такие вещи, когда обрабатываю файлы WebCam.

0

Другие программы / способы

Использование ftp небезопасно.
Защищенная версия ftp называется ftps , ftp secure. Попробуйте использовать его вместо ftp , если можете.

Это всегда хорошее упражнение для создания собственных сценариев, но лучше использовать инструменты, созданные для этой цели, когда они существуют. В качестве более удобной альтернативы вы можете использовать wget (см. Ниже), который не потребует установки другого удаленного сервера.

Поскольку у вас есть доступ к удаленному компьютеру, если он установлен, вы также можете использовать rsync .
Если это не так, попробуйте использовать scp -p или sftp , используя ssh-ключ [ 4 ] .

Если вы хотите придерживаться ftp , используйте опцию mget которая будет слепо копировать все файлы из каталога, но заранее установите режим передачи файлов в двоичный файл с помощью binary команды.


Wget

wget - неинтерактивный сетевой загрузчик [ 1, 2 ]. Ты можешь использовать:

wget -S -N "ftp://YourSite/Events/_PPV_Barker/Barker*_480i.ts" 

Опция -N - сохранять временные метки и загружать только файлы, более новые, чем локальные.
Цитата " может понадобиться, чтобы избежать расширения оболочки под Linux.
Он работает и под Windows (конечно, с версией программы для Windows).


Более полная командная строка в вашем случае (и только в одной строке) должна быть:

wget -user=USERNAME -password=PASSWORD 
     -N "ftp://YourSite/Events/_PPV_Barker/Barker*_480i.ts" 

Конечно, более разумно избегать написания пароля в командной строке или в сценариях ... вместо этого вы можете просто использовать самоочевидный параметр --ask-password .

Более прекрасное решение в Linux - поместить необходимую информацию в файл с именем .wgetrc . Должно быть легко найти эквивалентное имя в документации Windows.

$ cat ~/.wgetrc
ftp_user=UsernameOnTheRemoteFTP
ftp_password=PasswordOnTheRemoteFTP
http_user=UsernameOnTheRemoteHTTP
http_password=PasswordOnTheRemoteHTTP

Вы можете прочитать из wget --help или из man wget:

-N, - отметка времени не восстанавливать файлы, если они не новее локальных
-S, --server-response ответ сервера печати.

--user = пользователь
--password = пароль
Укажите имя пользователя, пароль и пароль для получения файлов по FTP и HTTP. Эти параметры могут быть переопределены с помощью параметров --ftp-user и --ftp-password для соединений FTP и параметров --http-user и --http-password для соединений HTTP.


0

попробуйте использовать:

mget

команда. Я посмотрел его, и он говорит, получить несколько файлов.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .