複数のフォルダー内のファイルに対してコマンドを実行するにはどうすればよいですか?

複数のフォルダー内のファイルに対してコマンドを実行するにはどうすればよいですか?

複数のフォルダに存在する複数のファイルに対してコマンドを実行する方法を見つけようとしています。私の理解では、forCMD でこれを行うにはループが最適な方法です (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

  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="これを機能させるには (区切り文字がないことを指定した) を使用する必要があります。
  2. 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 1file 2ディレクトリを の下に作成しFolder A、 とfile 3ディレクトリfile 4を の下に作成しますFolder B。また、@dave_thompson_085 が指摘しているように、%~pa%~naを に結合することもできます%~pna

関連情報