2016-08-13 5 views
0

Надеюсь получить помощь здесь. У меня есть куча файлов, которые отслеживаются и конечный объект удален, файлы выглядят следующим образом:Переименование файлов после определенного символа

LastName, FirstName_DOS-Facility.pdf

Я в настоящее время работают ниже:

@echo off 

for /F "tokens=1,* delims=-" %%a in ('dir /A-D /B "*.pdf"') do (
    ECHO move "%%a-%%b" "%%a%%~xb" 
) 

И создает LastName, FirstName_DOS.pdf

Проблема, с которой я столкнулся, - это несколько файлов с тем же именем, мой командный файл просто заменяет старый файл более новым. Есть ли способ добавить _1.pdf _2.pdf _3.pdf и т. Д., Если необходимо? Спасибо вам за помощь!

ответ

1

Вот комментированный пакетный код, подходящий для ваших задач.

@echo off 
setlocal EnableExtensions EnableDelayedExpansion 

for /F "tokens=1* delims=-" %%a in ('dir "*-*.pdf" /A-D /B 2^>nul') do (
    if not exist "%%a%%~xb" (
     ren "%%a-%%b" "%%a%%~xb" 
    ) else (
     call :GetNextAppendix "%%a" "%%~xb" 
     ren "%%a-%%b" "%%a!NextAppendix!%%~xb" 
    ) 
) 

endlocal 
goto :EOF 

rem This subroutine inserts between file name passed as first argument 
rem and file extension passed as second argument an underscore and an 
rem incrementing number in range 1 to 50000 and checks if a file with 
rem this name already exists. If there is no file with current number 
rem in file name, this number with the preceding underscore is assigned 
rem to an environment variable used in parent process routine to rename 
rem the file. 

:GetNextAppendix 
for /L %%I in (1,1,50000) do (
    if not exist "%~1_%%I%~2" (
     set "NextAppendix=_%%I" 
     goto :EOF 
    ) 
) 

rem Windows command interpreter should never reach this part of the code. 
rem But in case of this really happens, simply clear the appendix variable 
rem which results in a failed renaming of file in parent process loop 
rem above with output of an error message because of file already existing. 

set "NextAppendix=" 
goto :EOF 

Для понимания используемых команд и как они работают, откройте окно командной строки, выполните там следующие команды, и читать полностью все справочные страницы отображаются для каждой команды очень тщательно.

  • call /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • ren /?
  • set /?
  • setlocal /?

И смотри также статью Microsoft о Using command redirection operators для объяснения 2^>nul которое 2>nul с перенаправлением оператора > отделался ^ для применения на выполнение команды DIR и не интерпретируется как операция перенаправления для команды ЗА в недопустимой позиции в командной строке.

Это перенаправляет вывод сообщения об ошибке на DIR ни в файле, соответствующего шаблон *-*.pdf от STDERR к устройству NUL, чтобы подавить его.

+0

Это было сделано! Огромное спасибо!! Теперь, если я найду способ прочитать DOS в имени файла, создайте папку (или просто переместите файл, если она существует) и переместите файл там, моя жизнь будет проще! –

0

Сохраните сценарий до test.bat и запустите с открытым запросом Cmd. Заменить dir значение с вашим путем. Дайте мне знать, если возникнут какие-либо ошибки.

@echo off 
setlocal enabledelayedexpansion 
set "dir=C:\My_Files" 
pushd "%dir%" 
for /F "tokens=1,* delims=-" %%a in ('dir /A-D /B "*.pdf" 2^>nul') do (
    call :rename %%a %%b) 
popd 
exit /b 

:rename 
set "i=" 
:loop 
if exist "%1!i!%~x2" (set /a "i+=1" & goto :loop) 
ren "%1-%2" "%1!i!%~x2" 
exit /b 
+0

Pls Upvote и принять ответ, который соответствует вашим потребностям, используя кнопки слева от окна ответов. – sambul35

+0

Спасибо за ответ!Этот скрипт просто дает дважды ошибку «Ошибка системы не может найти файл». С двумя .pdf в папке. –

+0

Обновлен сценарий. Вы заменили путь _dir_ своим? – sambul35

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