Windows批处理文件 - 使用自定义文件名填充文件

时间:2012-06-12 12:48:42

标签: windows loops batch-file set

我想创建一个Windows批处理文件“printFileNames.bat”,用于打印自定义文件名,如下所示:
Adobe_1DIFX_2WinRAR_3 ...

我无法弄清楚如何在循环中处理变量。这就是我所拥有的:

for /r C:\myDir\ %%i in (*) do (
   set counter=counter+1
   set myFileName=%%i+counter
   echo myFileName >> C:\list.txt
)

4 个答案:

答案 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)

要了解三件事:

  1. 如果要执行变量算术,请使用set /a命令(虽然文档有点过时)。
  2. 如果您想在if循环中使用for语句,它们将打破循环。您可以使用call来调用内部子例程,并从那里调用用户if。子例程中的参数通过变量%1%2等传递......(就像在普通的批处理文件中一样)。
  3. 假设完整路径存储在%%f中。如果您只想提取没有扩展名的名称,请使用%%~nf form
  4. 话虽如此,请尝试以下代码:

        @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!
)