如何让批处理文件在 For 循环中识别文件扩展名?

如何让批处理文件在 For 循环中识别文件扩展名?

我正在尝试制作一个批处理文件,比我上次制作的文件更新,我
计划将其添加到我以前的程序中,以便将它找到的所有相应的图像组织
到与其扩展名相对应的文件夹中。

因此,假设它找到一个.jpg文件,它会生成一个名为“ jpg”的文件夹并将该文件复制到其中。

我找到了一种可以起作用的方法,但是如果文件名中没有句点,那么它就太依赖于偶然性了。

我怎样才能使我的批处理文件识别文件的扩展名?

@echo off

set existing=0
for /r %%a in (*.bmp,*.gif,*.ico,*.jpeg,*.jpg,*.kra,*.png,*.svg,*.tif,*.tiff,*.webp) do echo %%a>>boobatest.txt

pause
cls

rem for /f "tokens=1-2 delims=." %%b in (%cd%\boobatest.txt) do echo %%b, %%c>>boobatestpt2.txt

for /f "tokens=1-2delims=." %%b in (%cd%\boobatest.txt) do (
    set "extension=%%c"
    call :vibecheck
    copy "%%b.%%c" "%cd%\boobatest\%%c"
   ) >nul

pause
del boobatest.txt

:vibecheck
if %existing%==1 exit /b 0

mkdir "%cd%\boobatest\%extension%"

set existing=1
exit /b 0

我也完全理解这可能根本不是
编写该程序代码的最小可能方式,但从
这个意义上讲,在批处理方面我并不是最有经验的。

我不知道如何才能使这段代码更短但又保留其当前设计。

答案1

如果您不知道有多少个点,请不要使用带点分隔符的标记。Cmd 有一个内置的 FOR 变量修饰符~x- 如果%%A在批处理脚本(或%A命令行)中是文件名,那么%%~nA是名称,%%~xA是扩展名,这是如果您从整个文件名 + 扩展名字符串的末尾向后读取并在第一个点处停止时看到的内容。

FOR /?你可以在提示符下或此处输入所有波浪号 (~) 变量修饰符SS64.com(它们还可以与参数 %0、%1、%2 等一起使用)

E:\test\extensions>dir
 Volume in drive E is SATA3-01
 Volume Serial Number is 452C-48AE

 Directory of E:\test\extensions

14/05/2021  20:34    <DIR>          .
14/05/2021  20:34    <DIR>          ..
14/05/2021  20:27                 8 hello.txt
14/05/2021  20:28                 8 hello.txt.xyz
14/05/2021  20:29                 8 hello.txt.xyz.pqr
14/05/2021  20:34                 8 hello.txt.xyz.pqr.chicken.burger
               4 File(s)             32 bytes
               2 Dir(s)    743675928576 bytes free

E:\test\extensions>for %A in (*.*) do @echo %A extension is %~xA
hello.txt extension is .txt
hello.txt.xyz extension is .xyz
hello.txt.xyz.pqr extension is .pqr
hello.txt.xyz.pqr.chicken.burger extension is .burger

答案2

@echo off

setlocal && cd /d "%~dp0"
set "_ext=bmp,gif,ico,jpeg,jpg,kra,png,svg,tif,tiff,webp"

for /f usebackq^tokens^=* %%i in (`^<con: %__AppDir__%where.exe /r . *.%_ext:,=,*.%
`)do 2>nul mkdir "%cd%\boobatest\%%~xi" & 2>nul copy "%%~fi" "%cd%\boobatest\%%~xi"

endlocal & goto :eof

  • 您可以替换命令For /R++ For /Fcall :Lable而无需创建,读取delete任何文件,只需使用一个For /f递归where命令即可......
for /f usebackq^tokens^=* %%i in (`^<con: %__AppDir__%where.exe /r . *.eXtension,*.eXtension,*.eXtension,*.eXtension..)do... 
  • 您正在调用一个:label没有传递参数的%existing%%extension%,将导致函数内的变量没有定义的值......此外,还要比较if "%strings%"=="sTrInGs"比较数字有些不同,if %integer% equ 1
call :vibecheck %existing% %extension%

:vibecheck 
rem :: Argument  <==> %~1 <==> %existing%
rem :: Argument  <==> %~2 <==> %extension%

if %existing% == 1 <==> if %~1 equ 1 exit /b 0

mkdir "%cd%\boobatest\%extension%" mkdir "%cd%\boobatest\%~2"
set existing=1
exit /b 0

  • 您可以设置一个变量用于循环......
set "_ext=bmp,gif,ico,jpeg,jpg,kra,png,svg,tif,tiff,webp"

:: in loop concatenate ::       variable         with manipulation :: 
::                      *.  +   %_ext:,=,*.%     <==>    , <==> ,*.
::                      *.  +   bmp,*.gif,*.ico,*.jpeg,*.jpg,*.kra,*.png,*.svg,*.tif,*.tiff,*.webp

:: results :: 
::           *.bmp,*.gif,*.ico,*.jpeg,*.jpg,*.kra,*.png,*.svg,*.tif,*.tiff,*.webp

your for loop command is.. 
for /f usebackq^tokens^=* %%i in (`^<con: %__AppDir__%where.exe /r .. *.bmp,*.gif,*.ico,*.jpeg,*.jpg,*.kra,*.png,*.svg,*.tif,*.tiff,*.webp`)do ...
  • 您可以使用循环使用 来创建目标文件夹mkdir \Targe\extension_folder,并在添加 时2>nul,如果文件夹不存在则会创建该文件夹,但如果文件夹存在,则只显示错误消息,其中,重定向到nul,不会因错误而产生任何干扰,也不会取得重大成就。
...)do 2>nul mkdir "%cd%\boobatest\%%~xi" & 2>nul copy "%%~fi" "%cd%\boobatest\%%~xi"

观察:1.我没有回答你的问题,所以,考虑一下@迈克尔·哈维回答...

观察:2。获取扩展 (%~xi)是你代码中最少的问题(并且已经被回答了 @迈克尔·哈维),它的功能取决于代码中所需的其他考虑/更正。


*// 编辑...

@echo off

setlocal && cd/d "%~dp0"
set "_skip="%cd%\boobatest"
set "_ext=bmp,gif,ico,jpeg,jpg,kra,png,svg,tif,tiff,webp"

for /f usebackq^tokens^=* %%i in (`^<con: ^<nul ^ 
;%__AppDir__%where.exe /r . *.%_ext:,=,*.% ^| %__AppDir__%findstr.exe /vi "%_skip%"`
)do >nul 2>&1 (mkdir "%cd%\boobatest\%%~xi" & copy/y "%%~fi" "%cd%\boobatest\%%~xi")

endlocal & goto :eof 
  • 另一件需要考虑的事情是,如果您要再次运行,或者,如果目标文件夹已经包含这些扩展名的任何文件,那么您必须在循环中跳过该文件夹,还要告知覆盖要复制的现有文件的操作。

编辑...//*


其他资源:

相关内容