文件扩展名的批处理循环数组
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 子程序有问题:
- 您指定了 "usebackq",但您没有使用反引号。请参见 FOR /?
- 你需要两个循环。一个外循环遍历扩展列表,一个内循环枚举文件夹中具有该扩展名的文件。
将您的 :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
作为解释:
- 每次通过外循环时,%%G 包含第一个标记(扩展名),%%H 包含所有其余标记(供以后使用)。
- 内部循环枚举具有该扩展名的文件。
- 子例程然后调用自身(递归),第一个参数是 %%H(其余扩展)。
- 重复直到列表中不再有扩展名。
一些一般性建议:
- 不时保存一份代码副本;特别是当你让它工作到一定程度时。
- 一次只改变一点点。在进行其他更改之前先让它工作。
有些东西可以正常工作,然后由于进行太多更改而失去它,这可能会非常令人沮丧:)
我正在尝试遍历一组文件扩展名,我能够让它以第一个扩展名为目标,但更改了代码,现在我不记得我做了什么。无论我使用的代码如何,都不会遍历扩展数组。如果您可以参考有助于回答的链接进行解释。
:: 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 子程序有问题:
- 您指定了 "usebackq",但您没有使用反引号。请参见 FOR /?
- 你需要两个循环。一个外循环遍历扩展列表,一个内循环枚举文件夹中具有该扩展名的文件。
将您的 :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
作为解释:
- 每次通过外循环时,%%G 包含第一个标记(扩展名),%%H 包含所有其余标记(供以后使用)。
- 内部循环枚举具有该扩展名的文件。
- 子例程然后调用自身(递归),第一个参数是 %%H(其余扩展)。
- 重复直到列表中不再有扩展名。
一些一般性建议:
- 不时保存一份代码副本;特别是当你让它工作到一定程度时。
- 一次只改变一点点。在进行其他更改之前先让它工作。
有些东西可以正常工作,然后由于进行太多更改而失去它,这可能会非常令人沮丧:)