私はバッチ ファイル プログラミングの初心者で、社内の元開発者が実装した既存のバッチ ファイルを分析しています。そこで、その開発者が何をしようとしていたのかを解明しようとしています。次のコマンドがあります。
for /r %x in (\\Server6\doc_production\*38316468*) do ren "%x" /y \\Server6\doc_production\error\
これは指定されたパスを再帰的に実行するループ コマンドであることはわかっています。ただし、不明な部分がいくつかあります。
パラメータ /y は何のために使用されるのでしょうか? Google で検索しても何も見つかりませんでした。
このコマンドは具体的に何を行うのでしょうか?
アップデート: 返信ありがとうございます。このコマンドはパターンに一致するファイルをエラー サブフォルダーに移動する、という意見が多かったので、ローカル マシンでテストしてみました。次のディレクトリを作成しました。
C:
├──test
│ └──error
そして、テスト フォルダーにファイル 38316468.sql を挿入しました。
次に、次のコマンドを実行しました。
for /r %x in (C:\doc_production\*38316468*) do ren "%x" /y C:\doc_production\error\
しかし、何も起こりません。コマンドはエラー メッセージなしで実行されます。構文エラーはありません。しかし、何も起こりません。ファイルは移動されず、ファイル名も変更されません。なぜこのようなことが起こるのでしょうか?
答え1
それは有効ではないようです。RENAME
(REN) には /y パラメータがなく、2 番目のパラメータはファイル名 (ここでのようなフォルダではない) である必要があります。MOVE
には "/y" があり、これは「ターゲットがすでに存在する場合に "よろしいですか" という質問で煩わせず、"はい" と答えたとみなす」という意味で、2 番目のパラメータとしてフォルダを指定しても問題ありません。
ただし、MOVE の場合、/Y は MOVE コマンドの直後、パラメータの前に表示する必要があります。REN を MOVE に置き換えても、構文エラーになります。
とにかく: FORコマンドはパターンに一致するすべてのファイル(サブディレクトリも調べます)のリストを作成します38316468そして、一致するものごとに REN を順番に呼び出します。REN (MOVE のはずです) は、各ファイルの名前を変更 (移動) してエラー フォルダーに移動しようとします。
ただし、/Y の使用は MOVE では依然として間違っています。
もう 1 つの問題は、エラーが FOR が動作しているソース フォルダーのサブフォルダーであることです。これにより、コマンドはファイルをそれ自体に移動しようとします (例: エラー フォルダーからエラー フォルダーへ)。これは、FOR コマンドが再度使用される前にエラー フォルダーが後でクリアされるかどうかによって、問題になる場合とならない場合があります。
最後になりましたが、注意事項があります。
バッチ ファイルで %X 変数を使用するには、% を 2 倍にして %%X にする必要があります。コマンド ラインでは、1 つの % を使用できます。また、%X 変数は大文字と小文字が区別されるため、%X と %x は同じではありません。
答え2
何をしているのかを知るために、詳しく見てみましょう。
for /r %x
このコマンドは、パスから始まるフォルダー ツリーをたどり\\Server6\doc_production\*38316468*
、一致する各ファイルに対して DO ステートメントを実行します。
コマンドでは、DO
または アクションはren
名前の変更を表します。
これ/y
によって、ソースのファイルを宛先に既に存在するものとして上書きするかどうかをコマンド プロンプトが確認するのを止めます。
最初のディレクトリでワイルドカード番号を検索し、名前を変更して /error/ フォルダーに保存しているように見えますが、実際に機能するためのファイル名はありません。このコマンドが正しく機能するには、/error/ フォルダーの後のファイル名を指定する必要があります。