
初めてバッチファイルを作成しようとしています。これは、毎週1回新しい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 コマンドを使用して、毎回一意の ID を持つファイルを取得するにはどうすればよいですか? または、if コマンド以外に方法はありますか?
どのような助けでもいただければ幸いです。
ありがとう
ケシャフ
答え1
私の理解が正しければ、サーバーにアクセスするたびに新しいファイルがあるが、その名前の詳細はわからないということです。ダウンロード後にファイルが削除されるのか、それともファイル数が増え続けていて最新のものを選択しなければならないのかはわかりません。
最も単純なケースでは、ファイルは 1 つだけであり、ここでの解決策はほぼ正しいです。ワイルド カードが機能する場合は、get
を に置き換えるという簡単な変更が 1 つ必要です。mget
*
echo mget Barker*_480i.ts>> temp.txt
このファイル マスクに一致するファイルが多数ある場合、アクセスごとにダウンロードされるファイルの数が増えていきます。手っ取り早い解決策は、ファイルを現在のディレクトリに保持し、読み取り専用にすることです。多くのエラーが発生しますが、新しいファイルがダウンロードされ、以前に取得したファイルを転送するオーバーヘッドは発生しません。
リモート ディレクトリへのフル アクセス権がある場合は、リモートでダウンロードしたファイルを削除、移動、または名前変更して、ファイル マスクに一致するファイルが毎回 1 つだけになるようにすることができます。
これらのいずれも実行できない場合は、2 つのftp
呼び出しが必要になります。最初の呼び出しでは、リモートからディレクトリ リストを取得し、それを以前のリモート リストと比較します。これにより、新しいファイルを識別して、2 番目のftp
呼び出しを作成してそれを取得できます。これを行うバッチ ファイルの作成は簡単ではありませんが、可能です。WebCam ファイルを処理するときに、このような操作を行います。
答え2
パスワードとユーザー名をスクリプト内に(プレーンテキストで)配置しても構わない場合は、コマンド ライン自体でそれらを使用してもかまいません。
古いファイルをダウンロードした後、ローカルにコピーして保存し、変更したりタイムスタンプを変更したりしない場合は、バッチファイルのアイデア全体を次のようにして排除できます。Windows 用の wget、--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
も。それが見つからない場合は、
を使用するか、ssh-key [scp -p
sftp
4]。
を使い続ける場合はftp
、mget
ディレクトリからすべてのファイルを盲目的にコピーするオプションを使用しますが、コマンドを使用してファイル転送モードをバイナリに事前に設定してくださいbinary
。
Wget
wget
- 非対話型ネットワークダウンローダー [1、2]を使用できます:
wget -S -N "ftp://YourSite/Events/_PPV_Barker/Barker*_480i.ts"
オプションは-N
、タイムスタンプを保持し、ローカルのファイルよりも新しいファイルのみをダウンロードすることです。Linuxでは、シェルの拡張を避けるために
引用符"
が必要になる場合があります。Windows
でも動作します (もちろん、プログラムの Windows バージョンで)。
より完全なコマンドラインあなたの場合(そして1行のみ)は次のようになります:
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, --サーバー応答 プリントサーバーの応答。--user=ユーザー
--password=パスワード
FTP および HTTP ファイル取得の両方に対して、ユーザー名 user とパスワード password を指定します。これらのパラメータは、FTP 接続の場合は --ftp-user および --ftp-password オプション、HTTP 接続の場合は --http-user および --http-password オプションを使用して上書きできます。