【问题标题】:Batch Loop array of file extensions文件扩展名的批处理循环数组
【发布时间】:2015-05-28 11:35:49
【问题描述】:

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

    :: ACTION :: 1 CLEAN
:cleanup
    set "Fdocs=%CD%\1_docs"
    set "Fphotos=%CD%\2_photos"
    set "Fdesigns=%CD%\3_designs"
    set "Freviews=%CD%\4_reviews"
    set "Ffinal=%CD%\5_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
)

【问题讨论】:

    标签: arrays batch-file command-line command batch-processing


    【解决方案1】:

    您的 :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. 一次只改变一点点。在进行其他更改之前先让它发挥作用。

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

    【讨论】:

    • RGuggisberg,百万感谢您的解释,出于某种原因,我知道我可能不得不考虑使用两个循环,但认为有一种方法可以使用单个循环来规避它。现在我明白这是不可能的。也感谢您的编码建议,我通常对小编辑非常擅长,但在这个问题的实验中真的很纠结,这将继续提醒自己良好的编码习惯。感谢您所做的一切,这绝对是一个很好的开始。顺便说一句,您发现哪些链接对学习命令/批处理脚本有用?
    • 网络上有很多信息。我觉得非常有用的几个网站是:ss64.orgss64.com/ntrobvanderwoude.com
    猜你喜欢
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 2012-06-17
    相关资源
    最近更新 更多