2

我想创建一个 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
)
4

4 回答 4

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以将数字与文件名分开,并ECHO产生最终输出,其中数字附加到文件名。

请注意,数字会附加到names,即在扩展名之前,因此文件名如下:

D:\path\name.ext

更改为以下内容:

D:\path\name_1.ext

如果你真的希望它是这样的:

D:\path\name.ext_1

将上面的命令替换ECHO为以下内容:

ECHO %%S_%%R
于 2012-06-12T20:32:06.557 回答
3

需要知道的三件事:

  1. 如果要执行变量算术,请使用set /a命令(虽然文档有点过时)。
  2. 如果你想if在循环中使用语句for,它们将打破循环。您可以使用call调用内部子例程,并if从那里调用用户。子程序中的参数通过变量%1,%2等传递...(就像在普通的批处理文件中一样)。
  3. 让我们假设完整路径存储在%%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%

编辑:修复脚本以处理特殊文件名并跳过具有某些扩展名的文件。

希望能帮助到你!

于 2012-06-12T15:58:34.823 回答
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
)
于 2012-06-12T13:04:10.710 回答
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!
)
于 2012-06-12T13:16:41.313 回答