【问题标题】:batch script moving multiple file extensions to sub folder passing parameters to a single subroutine批处理脚本将多个文件扩展名移动到子文件夹将参数传递给单个子例程
【发布时间】:2026-01-04 12:10:01
【问题描述】:

所以,我正在尝试编写一个批处理脚本操作来处理将某些类型的文件扩展名(照片 = .jpg、.png 等)移动到它们各自的子目录。

我遇到的问题是,当我开始运行循环时,循环不会停止,并且我无法跟踪是否正在循环某些类型。

有没有办法在单个子程序中执行此操作?还是更好的方法?另外,如果您可以留下有用的链接,因为我真的很想更彻底地了解我在编码的内容。

我正在运行 Windows 8.1

    :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

:: Create a subroutine function loop : FOR , go through array file extentions and move to destination
:: FOR /F
:fMover
for %%a in (%1) do move "%CD%\*%%a" "%CD%\%2"
echo %%a
timeout 1 >nul

:: 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
:: for %%a in (%$ext%) do move "%CD%\*%%a" "%CD%\%Fphotos%"
call :fMover %$ext% %Fphotos%
cls
echo %action% project folder..
timeout 1 >nul


:: CLEAN :: designs
set $ext=.psd .psb
call :fMover %$ext% %Fdesigns%
::for %%a in (%$ext%) do move "%CD%\*%%a" "%CD%\%Fdesigns%\2_psd"
set $ext=.ai .svg .svgz .esp
call :fMover %$ext% %Fdesigns%
::for %%a in (%$ext%) do move "%CD%\*%%a" "%CD%\%Fdesigns%\1_ai"
set %ext=.indd .idml 
call :fMover %$ext% %Fdesigns%
::for %%a in (%$ext%) do move "%CD%\*%%a" "%CD%\%Fdesigns%\3_indd"
cls
echo %action% project folder...
timeout 1 >nul


cls
echo done.
timeout 2 >nul

【问题讨论】:

  • :: CLEAN :: designs 部分有错字:set %ext=.indd .idml。在回答中进行了更正。

标签: batch-file command-line window windows-8.1


【解决方案1】:

你的批处理结构可能如下(你应该跳过预定义的子程序并正确地从它返回):

    :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"
:: for %%a in (%$ext%) do move "%CD%\*%%a" "%CD%\%Fphotos%"
call :fMover "%$ext%" "%Fphotos%"
cls
echo %action% project folder..
timeout 1 >nul

:: CLEAN :: designs
set "$ext=.psd .psb"
call :fMover "%$ext%" "%Fdesigns%"
::for %%a in (%$ext%) do move "%CD%\*%%a" "%CD%\%Fdesigns%\2_psd"
set "$ext=.ai .svg .svgz .esp"
call :fMover "%$ext%" "%Fdesigns%"
::for %%a in (%$ext%) do move "%CD%\*%%a" "%CD%\%Fdesigns%\1_ai"
set "$ext=.indd .idml" 
call :fMover "%$ext%" "%Fdesigns%"
::for %%a in (%$ext%) do move "%CD%\*%%a" "%CD%\%Fdesigns%\3_indd"
cls
echo %action% project folder...
timeout 1 >nul

cls
echo done.
timeout 2 >nul
:: skip over predefined subroutine(s) and return from script
goto :eof

:: Create a subroutine function loop : FOR , go through array file extentions and move to destination
:: FOR /F
:fMover
for %%a in (%~1) do move "%CD%\*%%~a" "%CD%\%~2"
echo %%a
timeout 1 >nul
:: return from subroutine
goto :eof

资源:

【讨论】:

  • 看到我想知道子程序,如果返回到调用它们但发现它们没有通过测试的调用。JosefZ 你认为模块化更复杂的操作并进行批处理更好吗批处理调用而不是构建单个批处理来处理相同类型的操作?
  • 这是你的喜好;模块化方法(技术)不是坏主意或坏主意,恕我直言。但是,您可以通过省略所有 set 命令(或大多数命令)来使您的脚本更简单、更具可读性,并将直接文字值传递给过程如下(例如):call :fMover ".psd .psb" "%CD%\3_designs"
  • 好吧,Josef 我觉得我几乎可以完成这个任务,唯一的问题是我不认为 for 循环会遍历数组,比如存储文件扩展名的对象。我能够打印第一个扩展名,但这就是我研究并认为可能的解决方案可能来自 Dir /b 但不确定如何按照 ss64.com ss64.com/nt/for_f.html (filenameset) 的指示使用 for 循环