複数のフォルダに存在する複数のファイルに対してコマンドを実行する方法を見つけようとしています。私の理解では、for
CMD でこれを行うにはループが最適な方法です (Windows を使用しています)。ただし、いくつか問題が発生しているため、必要な操作の 1 つを例として使用します。
この特定のコマンドでは、複数のフォルダー内に複数のファイル用のフォルダーを作成しようとしています。図を以下に示します。
Folder A
File 1.avi
File 2.avi
Folder B
File 3.avi
File 4.avi
いろいろ検索してみたところ、次のコマンドを見つけました:
for /f "delims=*" %a in ('dir *.avi /b /s') do md "%~na"
私が集めたものはこここれはほぼ正しいです。複数のフォルダー内に含まれる各ファイルに対してフォルダーを作成します。問題は、これらの新しいフォルダーをファイルと同じフォルダー内に含める必要があることです。この特定のコマンドは、新しいフォルダーを元のフォルダー内ではなく、元のフォルダーと同じ場所に配置してしまいます。
誰か何かアイデアをお持ちですか? どんな助けでもいただければ幸いです。ありがとうございます。
答え1
標準的なデバッグ手法としては、
echo
スクリプトや複合コマンドにコマンドを挿入することが挙げられます。for /f "delims=*" %a in ('dir *.avi /b /s') do @echo md "%~na"
出力が得られます
"file 1" "file 2" "file 3" "file 4"
ノート:
- の
@
echo
コマンドを禁止する彼ら自身表示されないので、出力のみが表示されます。 "delims=…"
for
コマンドからの出力行を解析する方法を示しますdir *.avi /b /s
。リンク先の回答が を示唆している理由がわかりません"delims=*"
。ただし、デフォルトの動作では行をスペースで分割するため、ディレクトリ名やファイル名にスペースが含まれている場合 (指定したとおり)、"delims="
これを機能させるには (区切り文字がないことを指定した) を使用する必要があります。
- の
for /?
またはと入力するとhelp for
、コマンドに関するドキュメントが表示されますfor
。5ページ目には、In addition, substitution of FOR variable references has been enhanced. You can now use the following optional syntax: %~I - expands %I removing any surrounding quotes (") ︙ %~pI - expands %I to a path only %~nI - expands %I to a file name only ︙ The modifiers can be combined to get compound results … ︙
これは、 が にあるフルネーム
%~na
のファイルの名前だけを取得する理由を説明しています。では、*.avi
%a
for /f "delims=" %a in ('dir *.avi /b /s') do @echo md "%~pa"
そしてあなたは得るでしょう
「現在のディレクトリ\フォルダA\" 「現在のディレクトリ\フォルダA\" 「現在のディレクトリ\フォルダB\" 「現在のディレクトリ\フォルダB\"
そこから、あなたがやりたいことは
for /f "delims=" %a in ('dir *.avi /b /s') do md "%~pa%~na"
file 1
とfile 2
ディレクトリを の下に作成しFolder A
、 とfile 3
ディレクトリfile 4
を の下に作成しますFolder B
。また、@dave_thompson_085 が指摘しているように、%~pa%~na
を に結合することもできます%~pna
。