2015-12-17 8 views
0

У меня есть группа из примерно 3000 папок с именем XYZ-1 до XYZ-3000. Внутри этих папок находятся группы файлов изображений и текстовый файл описания. Такие, как:Как переименовать папку так же, как имя файла первого файла внутри этой папки, используя пакетное программирование Windows?

  • Property123_0001.jpg
  • Property123_0002.jpg
  • Property123_0003.jpg
  • ...
  • Property123_0085.jpg
  • Property123_0086.jpg
  • Z_Description.txt

Количество файлов .jpg отличается в каждой папке, но всегда есть один файл описания. Файлы изображений каждого каталога имеют другое имя, например, `XYZ-1 может содержать свойство123, а XYZ-10 может содержать Easement789.

Мне нужно переименовать папки, содержащие файлы, после «Property123» части файлов .jpg. В идеале я бы урезал конечные цифры и подчеркивание, но даже если бы они остались, это было бы лучше, чем имена XYZ-1.

Я работаю над пакетным файлом, чтобы сделать это, но мой не запускается, и я не могу понять, почему.

Вот что у меня есть:

for /d %%D in (*) do (
    set "_dir=%%D" 
    set /a "_first=1" 
    cd "%%D" 
    for %%F in (*) do (
     if %_first%==1 set "_name=%%~nF" 
     set /a "_first=0" 
    ) 
    cd .. 
    ren %_dir% %_name% 
) 

К сожалению, когда я запускаю его, окно командной строки просто закрывается немедленно. Я попытался положить команду паузы в конце, но это не закрыло окно. Ничего не происходит с файлами/папками.

Я пробовал свой синтаксис из командной строки, и все выглядит нормально. Поэтому я не знаю, в чем проблема. Могу ли я немного помочь, пожалуйста?

+0

Какие числовые цифры вы говорите по поводу усечения: те, после '_', или же те, до (' 123' в списке файлов образца)? – aschipfl

ответ

0

Попробуйте это:

@echo off 
setlocal EnableDelayedExpansion 
for /d %%D in (*) do (
    set "_dir=%%D" 
    set "_name=%%D" 
    set /a "_first=1" 
    cd "%%D" 
    for %%F in (*) do (
     if !_first!==1 set "_name=%%~nF" 
     set /a "_first=0" 
    ) 
    cd .. 
    ren !_dir! !_name! 
) 

Вы должны использовать SETLOCAL EnableDelayedExpansion здесь, и использовать! вместо% внутри для циклов.

Я также добавил набор «_name = %% D», поэтому он не будет пытаться изменить вторую папку с именем папки, если эта папка не содержит файлы

EDIT:

также принимает во внимание подчеркивание части:

@echo off 
setlocal EnableDelayedExpansion 
for /d %%D in (*) do (
    set "_dir=%%D" 
    set "_name=%%D" 
    set /a "_first=1" 
    cd "%%D" 
    for %%F in (*) do (
     if !_first!==1 (
     set "_name=%%~nF" 
     set /a "_first=0" 
     if NOT "!_name!"=="!_name:_=!" (
      set "subfix=!_name:*_=!" 
      for /f "delims=" %%B in ("!subfix!") do set "_name=!_name:_%%B=!" 
     ) 
    ) 
    ) 
    cd .. 
    ren !_dir! !_name! 
) 
+0

Я определенно буду читать! индикатор и замедленное расширение. Я никогда не использовал их, прежде чем не знаю, что они делают. –

+0

Если мой ответ решит ваш вопрос, вы должны пометить его как правильно, щелкнув по нему слева. –

+0

Я постараюсь, чтобы нижняя подчеркивающая часть работала завтра, но это будет намного сложнее. –

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

  • Нет связанных вопросов^_^