我想创建一个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
)
答案 0 :(得分:4)
可以在不使用显式计数器的情况下获得所需的输出:
@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
的输出以将数字与文件名分开,{ {1}}生成最终输出,其中数字附加到文件名。
请注意,这些数字会附加到名称,即在扩展名之前,以便像这样的文件名:
ECHO
更改为以下内容:
D:\path\name.ext
如果你真的希望它是这样的:
D:\path\name_1.ext
使用以下内容替换上面的D:\path\name.ext_1
命令:
ECHO
答案 1 :(得分:3)
要了解三件事:
set /a
命令(虽然文档有点过时)。if
循环中使用for
语句,它们将打破循环。您可以使用call
来调用内部子例程,并从那里调用用户if
。子例程中的参数通过变量%1
,%2
等传递......(就像在普通的批处理文件中一样)。%%f
中。如果您只想提取没有扩展名的名称,请使用%%~nf
form。话虽如此,请尝试以下代码:
@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%
编辑:修复脚本以处理特殊文件名并跳过具有特定扩展名的文件。
希望它有所帮助!
答案 2 :(得分:1)
您需要延迟扩展才能访问循环中计数器的值
要增加计数器,您需要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
)
答案 3 :(得分:1)
@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!
)