我正在尝试制作一个批处理文件,比我上次制作的文件更新,我
计划将其添加到我以前的程序中,以便将它找到的所有相应的图像组织
到与其扩展名相对应的文件夹中。
因此,假设它找到一个.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 /F
,call :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º <==> %~1 <==> %existing%
rem :: Argument 2º <==> %~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
- 另一件需要考虑的事情是,如果您要再次运行,或者,如果目标文件夹已经包含这些扩展名的任何文件,那么您必须在循环中跳过该文件夹,还要告知覆盖要复制的现有文件的操作。
编辑...//*