我想创建一个 Windows 批处理文件“printFileNames.bat”来打印自定义文件名,如下所示:
Adobe_1
, DIFX_2
, WinRAR_3
...
我无法弄清楚如何在循环中使用变量。这就是我所拥有的:
for /r C:\myDir\ %%i in (*) do (
set counter=counter+1
set myFileName=%%i+counter
echo myFileName >> C:\list.txt
)
我想创建一个 Windows 批处理文件“printFileNames.bat”来打印自定义文件名,如下所示:
Adobe_1
, DIFX_2
, WinRAR_3
...
我无法弄清楚如何在循环中使用变量。这就是我所拥有的:
for /r C:\myDir\ %%i in (*) do (
set counter=counter+1
set myFileName=%%i+counter
echo myFileName >> C:\list.txt
)
无需使用显式计数器即可获得所需的输出:
@ECHO OFF
FOR /F "delims=: tokens=1*" %%R IN ('DIR /A-D-H /B /S D:\to_delete\* ^| FINDSTR /N .') DO (
ECHO %%~dpnS_%%R%%~xS
)
该DIR
命令提供文件列表,FINDSTR
为其提供数字,FOR /F
循环处理输出FINDSTR
以将数字与文件名分开,并ECHO
产生最终输出,其中数字附加到文件名。
请注意,数字会附加到names,即在扩展名之前,因此文件名如下:
D:\path\name.ext
更改为以下内容:
D:\path\name_1.ext
如果你真的希望它是这样的:
D:\path\name.ext_1
将上面的命令替换ECHO
为以下内容:
ECHO %%S_%%R
需要知道的三件事:
set /a
命令(虽然文档有点过时)。if
在循环中使用语句for
,它们将打破循环。您可以使用call
调用内部子例程,并if
从那里调用用户。子程序中的参数通过变量%1
,%2
等传递...(就像在普通的批处理文件中一样)。%%f
. 如果您想只提取不带扩展名的名称,请%%~nf
使用.话虽如此,请尝试以下代码:
@echo off
set counter=0
for /r "C:\myDir\" %%f in (*) do (
set /a counter+=1
call :HandleFile "%%f"
)
goto :eof
:HandleFile
if "%~x1"==".jpg" goto :eof
if "%~x1"==".gif" goto :eof
set "myFileName=%~n1_%counter%"
for %%^" in ("") do >>C:\list.txt echo %%~"%myFileName%
编辑:修复脚本以处理特殊文件名并跳过具有某些扩展名的文件。
希望能帮助到你!
您需要延迟扩展才能访问循环中计数器的值。
为了增加你的计数器,你需要这个SET /A
开关。
setlocal EnableDelayedExpansion
set counter=0
for /r C:\myDir\ %%i in (*) do (
set /a counter=counter+1
set "myFileName=%%i_!counter!"
echo !myFileName!>> C:\list.txt
)
如果您的文件名包含感叹号!
,这将失败,那么您需要像这样的更稳定的版本
setlocal DisableDelayedExpansion
set counter=0
for /r C:\myDir\ %%i in (*) do (
set /a counter=counter+1
set "filename=%%i"
setlocal EnableDelayedExpansion
set "myFileName=!filename!_!counter!"
echo !myFileName!>> C:\list.txt
endlocal
)
@echo off
setLocal EnableDelayedExpansion
set N=0
for /f "tokens=1 delims=." %%i in ('dir /b C:\mydir\') do (
set /a N+=1
echo %%i_!N!
)