文件扩展名的批处理循环数组

Batch Loop array of file extensions

我正在尝试遍历一组文件扩展名,我能够让它以第一个扩展名为目标,但更改了代码,现在我不记得我做了什么。无论我使用的代码如何,都不会遍历扩展数组。如果您可以参考有助于回答的链接进行解释。

    :: ACTION :: 1 CLEAN
:cleanup
    set "Fdocs=%CD%_docs"
    set "Fphotos=%CD%_photos"
    set "Fdesigns=%CD%_designs"
    set "Freviews=%CD%_reviews"
    set "Ffinal=%CD%_final"
    set "$ext="
    set "action=Cleaning"

:: CLEAN :: documents
    set "$ext=.txt .doc .docx .xls .csv .ppt .pptx"
    call :fMover "%$ext%" "%Fdocs%"

    cls
    echo %action% project folder.

:: CLEAN :: images
    set "$ext=.jpg .png .tiff .raw .nef .crw .dng"
    call :fMover "%$ext%" "%Fphotos%"

    cls
    echo %action% project folder..

:: CLEAN :: designs
    set "$ext=.psd .psb"
    call :fMover "%$ext%" "%Fdesigns%"

    set "$ext=.ai .svg .svgz .esp"
    call :fMover "%$ext%" "%Fdesigns%"

    set "$ext=.indd .idml"
    call :fMover "%$ext%" "%Fdesigns%"

    cls
    echo %action% project folder...
    echo done.

    goto :intro

:fMover
for /F "usebackq tokens=* delims==" %%G in ('dir /b /s %CD%\*%~1') do (
    rem move %%G %~2
    echo "%%G" %~2
    echo %~2
    rem echo %~1
    timeout 2 >nul
    pause
    goto :eof
)

您的 :fMover 子程序有问题:

  1. 您指定了 "usebackq",但您没有使用反引号。请参见 FOR /?
  2. 你需要两个循环。一个外循环遍历扩展列表,一个内循环枚举文件夹中具有该扩展名的文件。

将您的 :FMover 更改为此,然后根据需要从那里进行更改。

:fMover
pause
for /F "tokens=1*" %%G in ('echo.%~1') do (
   echo.  
   echo.Move files with extension=%%G to %~2
   for /F "usebackq tokens=*" %%K in (`dir /b /s "%CD%\*%%G"`) do (
      echo %%K
      rem move %%K %~2
   )
   if not "%%H"=="" call :fMover "%%H" "%~2"
)
goto :eof

作为解释:

  1. 每次通过外循环时,%%G 包含第一个标记(扩展名),%%H 包含所有其余标记(供以后使用)。
  2. 内部循环枚举具有该扩展名的文件。
  3. 子例程然后调用自身(递归),第一个参数是 %%H(其余扩展)。
  4. 重复直到列表中不再有扩展名。

一些一般性建议:

  1. 不时保存一份代码副本;特别是当你让它工作到一定程度时。
  2. 一次只改变一点点。在进行其他更改之前先让它工作。

有些东西可以正常工作,然后由于进行太多更改而失去它,这可能会非常令人沮丧:)