2012-06-12 2 views
2

Я хотел бы создать пакетный файл для Windows «printFileNames.bat», что печать имен пользовательских файлов следующим образом:
Adobe_1, DIFX_2, WinRAR_3 ...Windows, пакетный файл - заполнить файл с именами пользовательских файлов

I не может понять, как работать с переменными в цикле. Это то, что у меня есть:

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

ответ

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 
) 
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! 
) 
+0

Подход кажется правильным, но OP хочет рекурсивный цикл. Почему вы изменили его на '/ f'? –

+0

Да, вы правы, я забыл эту часть, когда я ищу, как удалить расширение из имени файла. – GuillaumeS

3

три вещи, чтобы знать:

  1. Если вы хотите выполнить переменную арифметику, используйте команду set /a (хотя документация немного устарела).
  2. Если вы хотите использовать операторы if внутри цикла for, они разрывают петлю. Вы можете использовать call для вызова внутренней подпрограммы, а пользователи if оттуда. Параметры в подпрограмме передаются через переменные %1, %2 и т. Д. (Как в обычном пакетном файле).
  3. Предположим, что полный путь хранится в %%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% 

EDIT: исправлен скрипт для обработки специальных имен файлов и пропустить файлы с определенными расширениями.

Надеюсь, это поможет!

+0

Вы не можете использовать оператор 'if' в цикле' for', потому что он сломает цикл. Вам нужно будет вызвать подпрограмму из цикла и делать ваши вещи оттуда. См. Мой отредактированный ответ. –

+0

Спасибо большое всем. Ты спас свой день. –

+0

@EitanT: Извините, но 'if' внутри' for' делает _NOT_, сломал его; вы можете использовать любую комбинацию команд 'if' и' for', вложенную на любом уровне без проблем! Что _DOES_ ломает команду 'for' - это' goto'! – Aacini

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 выдает окончательный вывод, где числа добавляются к именам файлов.

Обратите внимание, что цифры добавляются к именам , т.е.до расширения, так что имя файла, как это:

D:\path\name.ext 

изменения что-то вроде этого:

D:\path\name_1.ext 

Если вы действительно хотите, чтобы это было так:

D:\path\name.ext_1 

заменить ECHO, приведенный выше:

ECHO %%S_%%R 
+0

+1, Очень хорошая идея использовать findstr для _counting_ – jeb

+0

+1: Я считаю, что OP хотел этого: 'echo %% ~ nS _ %% R >> list.txt' –

Смежные вопросы