
Я пытаюсь создать пакетный файл в первый раз. Это будет загрузка файла, который обновляется раз в неделю с новым ID. Это пакетный файл, который я создал до сих пор -
@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?
Любая помощь будет оценена по достоинству.
Спасибо
Кешав
решение1
Если я правильно вас понял, каждый раз, когда вы заходите на сервер, появляется новый файл, но вы не знаете подробностей его имени. Я не знаю, удаляется ли файл после того, как вы его скачали, или у вас постоянно растет количество файлов, и вам приходится выбирать последний.
В простейшем случае есть только один файл, и здесь ваше решение почти верное: необходимо одно простое изменение, заменить get
на mget
, когда подстановочный знак *
сработает:-
echo mget Barker*_480i.ts>> temp.txt
Если есть много файлов, соответствующих этой маске файла, то вы будете загружать все большее количество файлов при каждом доступе. Быстрое и грязное решение — сохранить файлы в текущем каталоге и сделать их доступными только для чтения: вы получите много ошибок, но новый файл будет загружен, и у вас не будет накладных расходов на передачу файлов, которые вы получили ранее.
Если у вас есть полный доступ к удаленному каталогу, то вы можете удалить, переместить или переименовать загруженный файл на удаленном компьютере, так что каждый раз у вас будет только один файл, соответствующий маске файла.
Если вы не можете сделать ни одну из этих вещей, то вам понадобятся два ftp
вызова: первый получит список каталогов с удаленного компьютера, который вы затем сравните с вашим предыдущим удаленным списком, чтобы вы могли идентифицировать новый файл и создать второй ftp
вызов для его извлечения. Пакетный файл для этого будет нелегко написать, но это возможно — я делаю такие вещи, когда обрабатываю файлы WebCam.
решение2
Если вы готовы поместить свой пароль и имя пользователя в скрипт (в виде обычного текста!), то вы не должны возражать против их использования в самой командной строке.
Если вы сохраняете локальные копии старых файлов после их загрузки и не меняете их или их временные метки, вы можете полностью отказаться от идеи пакетного файла, используяwget для Windows, и включите --timestamping
опцию. Это позволит сравнить размер и временную метку локальных файлов с удаленными файлами, загружая удаленные файлы только в том случае, если один из них отличается или локальный файл не существует. В качестве дополнительного преимущества, если вы пропустили предыдущие обновления, он загрузит все новые файлы, а не только самый новый.
Ваша командная строка будет выглядеть примерно так:
`wget --ftp-user=<user> --ftp-password=<password> --timestamping ftp://example.com/Events/_PPV_Barker/Barker*_480i.ts`
Конечно, это предполагает, что у вас есть соответствующие привилегии для установки wget и что вы храните предыдущие копии локально.
решение3
попробуйте использовать:
mget
команда. Я поискал, и там написано получить несколько файлов.
решение4
Другие программы/способы
Использование ftp
не безопасно.
Безопасная версия ftp называется ftps
,ftp безопасный. Попробуйте использовать его вместо 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 Ответ сервера печати.--пользователь=пользователь
--password=пароль
Укажите имя пользователя и пароль для получения файлов по FTP и HTTP. Эти параметры можно переопределить с помощью параметров --ftp-user и --ftp-password для FTP-подключений и параметров --http-user и --http-password для HTTP-подключений.