2016-08-08 7 views
1

私はこのように動作しますWindowsのバッチを作成する必要があります。N個のファイルやフォルダ全体をループするバッチファイルを作る方法は?

  • あなたはそれをあなたがそれにXファイル
を含むフォルダをドラッグすること Xファイル、または
  • をドラッグすること

    バッチはすべてのファイルに対してループし、次のような内容のファイル(渡されたフォルダまたは最初に渡されたファイルのフォルダ内に)を書き込みます。

    file1=FirstFileFound.ext 
    file2=SecondFileFound.ext 
    ... 
    file**X**=LastFileFound.ext 
    

    ここでは、ファイルの数えや書き方についてさまざまな例がありますが、可変数や引数の型を管理することはできません。

    可能ですか? そうでなければ、ファイル用とフォルダ用の2つの別々のバッチファイルもうれしいでしょうが、1つのファイルが最適です。 誰かが例を挙げることができますか?

  • 答えて

    1

    私はあなたのバッチファイルの複数のファイルやディレクトリの引数を処理する方法を表示する(コマンドラインまたはでドラッグ&配信-ドロップ)。提供されたすべてのディレクトリ引数について、その内容が列挙されます。あなたは空でない値に変数RECURSIVEを設定している場合、ディレクトリを再帰的に処理されます。

    @echo off 
    rem /* Define recursive mode globally: */ 
    set "RECURSIVE=" & rem // (empty means off, so non-recursive) 
    rem /* Define list file name: */ 
    set "LISTFILE=%~n0.lst" & rem // (use batch script name + `.lst`) 
    
    rem // Determine target location, depending on first argument: 
    set "ATTR=%~a1" 
    if defined ATTR (
        if "%ATTR:~,1%"=="d" (
         set "LOCATION=%~f1\%LISTFILE%" 
        ) else (
         set "LOCATION=%~dp1%LISTFILE%" 
        ) 
    ) 
    
    set /A "COUNTER=0" 
    rem // Loop through all arguments: 
    for %%A in (%*) do (
        rem // Call sub-routine for each argument: 
        if not "%%~A"=="" call :RESOLVE "%%~fA" 
    ) 
    exit /B 
    
    :RESOLVE 
    rem // Check if item is file or directory: 
    set "ATTR=%~a1" 
    if not "%ATTR:~,1%"=="d" (
        rem // Process a single file: 
        call :PROCESS "%~1" 
    ) else (
        rem // Check for recursive mode: 
        if not defined RECURSIVE (
         rem // Process all files in a directory: 
         for %%B in ("%~1\*.*") do (
          call :PROCESS "%%~B" 
         ) 
        ) else (
         rem // Process all files in a directory recursively: 
         for /R "%~1" %%B in ("*.*") do (
          call :PROCESS "%%~B" 
         ) 
        ) 
    ) 
    exit /B 
    
    :PROCESS 
    rem // Process a single file: 
    set /A "COUNTER+=1" 
    if %COUNTER% EQU 1 (
        > "%LOCATION%" echo file%COUNTER%=%~nx1 
    ) else (
        >> "%LOCATION%" echo file%COUNTER%=%~nx1 
    ) 
    exit /B 
    

    @echo off 
    rem /* Define recursive mode globally: */ 
    set "RECURSIVE=" 
    
    rem // Loop through all arguments: 
    for %%A in (%*) do (
        rem // Call sub-routine for each argument: 
        if not "%%~A"=="" call :RESOLVE "%%~fA" 
    ) 
    pause 
    exit /B 
    
    :RESOLVE 
    rem // Check if item is file or directory: 
    set "ATTR=%~a1" 
    if not "%ATTR:~,1%"=="d" (
        rem // Process a single file: 
        call :PROCESS "%~1" 
    ) else (
        rem // Check for recursive mode: 
        if not defined RECURSIVE (
         rem // Process all files in a directory: 
         for %%B in ("%~1\*.*") do (
          call :PROCESS "%%~B" 
         ) 
        ) else (
         rem // Process all files in a directory recursively: 
         for /R "%~1" %%B in ("*.*") do (
          call :PROCESS "%%~B" 
         ) 
        ) 
    ) 
    exit /B 
    
    :PROCESS 
    rem // Process a single file (simply echo it): 
    echo %~1 
    exit /B 
    

    があなたの仕事のためにこれを適用するには、次のスクリプトを使用することができます

    +0

    ありがとう! これは私の問題を完全に解決し、あなたのコメントと説明は私の学習と理解に役立ちます。 – Parduz

    0

    floop1.batは、ディレクトリ内の(* .ext)ファイルの各インスタンスに対してfloop2.batを実行します。そのフォルダから TEST.BAT 、オープンCmdをプロンプトとして

    @echo %1 
    
    0

    保存このスクリプト、およびを使用してバッチを実行します。

    floop1.bat:

    for %%f in (*.ext) do @call floop2.bat "%%f" 
    

    floop2.batターゲットフォルダパスをパラメータとして指定します。ターゲットフォルダに保存されているすべてのファイルの名前をfiles.txtに保存します。

    @echo off 
    set "dir=%~1" 
    pushd "%dir%" 
    For /R "%dir%" %%G IN (*.*) do (
    echo %%G >> files.txt) 
    popd 
    exit /b 
    
    c:\\batches\test.bat "K:\Files" 
    

    あなたのバッチデスクトップショートカットのプロパティに上記のコマンドを追加することができます - 、ショートカットをダブルクリックするので、次回フィールドをターゲット、バッチが実行されます。しかし、ドラッグ&ドロップ操作がCmd.exeによってサポートされているかどうかは疑問です。 :)

    2

    このバッチファイルは、あなたがやりたいこと:ここでは

    @echo off 
    setlocal EnableDelayedExpansion 
    
    set "list=%*" 
    for %%a in (%1) do set "attr=%%~Aa" & set "dir=%%~DPa" 
    if "%attr:~0,1%" equ "d" set "list=*.*" & set "dir=%1" 
    cd "%dir%" 
    set "i=0" 
    (for %%a in (%list%) do (
        set /A i+=1 
        echo file!i!=%%~NXa 
    )) > aFile.txt 
    
    関連する問題