Вопрос Переименовывать файлы последовательно из ввода с помощью командного файла?


Компания, с которой я работаю, обрабатывает счета, и я регулярно проверяю эти счета на точность, сравнивая то, что было введено в базу данных, и фактическое изображение счета. Каждый раз, когда я нахожу ошибку в обработке, я должен удалить счет из базы данных и отправить изображение на процессор, чтобы правильно ввести счет. Однако наша система часто сталкивается с сбоем, если, если я попытаюсь загрузить счет на сервер, который доставит его на процессор, он говорит, что существует дубликат файла. Чтобы обойти эту проблему, мне нужно вручную переименовать каждое изображение с новым именем (мы используем рулоны контрольных номеров для обозначения наших изображений).

Я хотел бы автоматизировать этот процесс, чтобы я мог быстро переименовать эти файлы в последовательном порядке. Я хотел бы, чтобы мой командный файл имел вход, чтобы я мог ввести начальный контрольный номер, и он будет переименовывать каждый файл в каталог в последовательном порядке, начиная с контрольного номера. Я ввожу +1 к каждому дополнительному файлу в каталоге, например, он будет выглядеть следующим образом:

Пакетный файл запрашивает у меня начальный контроль #. Я вхожу в 6654821.

  • bill3210851.pdf переименован в 6654821
  • imagebill654.pdf переименован в 6654822
  • random_name.pdf переименован в 6654823
  • billerror.pdf переименован в 6654824
  • sendtomanual.pdf переименован в 6654825

Исходное имя файла совсем не актуально, им не нужно оставаться в каком-либо конкретном порядке, если они будут последовательно переименованы.

Пока что у меня есть это:

@echo OFF
title Batch Rename
color 5f

echo Hello! I'm the batch pdf renamer. Please enter the starting control number:
set /p start=

ren %userprofile%\desktop\needrenamed\*.pdf "%p%.pdf"

pause

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


2
2017-11-14 01:58


происхождения


Как использовать стороннюю утилиту, например Массовый инструмент переименования? Следить за этим ссылка и узнать больше. Этот инструмент даст вам необходимую гибкость - Prasanna


ответы:


Я написал этот пакетный скрипт и надел его на мой Gist Repo, Это требует доступа к Windows Scripting Host. Вот файл:

@set @junk=1 /*
@echo off
cscript //nologo //E:jscript %0 %*
goto :eof
*/

var args=WScript.Arguments, shell=WScript.CreateObject("WScript.Shell"), bForced=false, nStartIndex=-1;

if(args.length==0||(args.length==1&&(bForced=args(0).toLowerCase()=='-f'||args(0).toLowerCase()=='--force'))) {
    showHelp();
    WScript.Echo("\nERROR: You must provide a starting value to begin counting at.");
    WScript.Quit(1);
}
if(args(0)=='-?'||args(0).toLowerCase()=='--help') {
    showHelp();
    WScript.Quit(0);
}
if(isNaN(nStartIndex=parseInt(args(bForced?1:0)))||nStartIndex<0) {
    showHelp();
    WScript.Echo(sprintf("\nERROR: The value [%s] which was given for start index is invalid. It should be a positive integer.", nStartIndex));
    WScript.Quit(2);
}

var fso=new ActiveXObject("Scripting.FileSystemObject");
var folder=fso.GetFolder(shell.CurrentDirectory);
var enFiles=new Enumerator(folder.Files);
var oFile, file_path, file_ext;

if(!bForced) {
    for(var nCurDX=nStartIndex; !enFiles.atEnd(); enFiles.moveNext(), nCurDX++) {
        oFile=enFiles.item();
        file_path=oFile.Name;
        file_ext=getFileExt(file_path);
        WScript.Echo(sprintf("Rename %s to %s", file_path, nCurDX+file_ext));
    }
    WScript.Echo("Type 'yes' to continue...");
    if(WScript.StdIn.ReadLine().toLowerCase()!="yes") {
        WScript.Echo("\nAction cancelled by user.");
        WScript.Quit(-1);
    }
    enFiles=new Enumerator(folder.Files);
}

for(var nCurDX=nStartIndex; !enFiles.atEnd(); enFiles.moveNext(), nCurDX++) {
    oFile=enFiles.item();
    file_path=oFile.Name;
    file_ext=getFileExt(file_path);
    try {
        oFile.Name = nCurDX+file_ext;
    } catch(e) {
        WScript.Echo(sprintf("\nERROR: Cannot rename file:\n\t%s\n\nReason: %s\n", file_path, e.description));
        WScript.Quit(3);
    }
}

/////////////////////////////////
/////////// FUNCTIONS ///////////
/////////////////////////////////

function sprintf(format, etc) { var arg=arguments, i=1; return format.replace(/%((%)|s)/g, function (m) { return m[2] || arg[i++] }); }
function showHelp() {
    WScript.Echo("------------------");
    WScript.Echo("Numeric Rename All");
    WScript.Echo("------------------");
    WScript.Echo("");
    WScript.Echo("This file will change the file title of all files is a directory");
    WScript.Echo("so that they are all just an incremented number with the original");
    WScript.Echo("extension still in place.");
    WScript.Echo("");
    WScript.Echo("Usage: NUMERIC_RENAME_ALL [ -? | --help ] [ -f | --force ] <start-index>");
    WScript.Echo("");
    WScript.Echo("\t-?, --help\tDisplay this help screen and exit.");
    WScript.Echo("");
    WScript.Echo("\t-f, --force\tRename the files without prompting first.");
    WScript.Echo("");
    WScript.Echo("\t<start-index>\tThe value to begin counting at.");
    WScript.Echo("");
    WScript.Echo("This script takes one parameter and that is the number to begin at.");
    WScript.Echo("For example (if called with 12345 as the parameter):");
    WScript.Echo("");
    WScript.Echo("\ttest1.jpg becomes 12345.jpg");
    WScript.Echo("\ttest1.jpg.txt becomes 12346.jpg.txt");
    WScript.Echo("\ttest2.pdf becomes 12347.jpg");
    WScript.Echo("");
    WScript.Echo("Currently, there is no way to sort the items and they will be");
    WScript.Echo("numbered according to the default file order for your system.");
    WScript.Echo("");
    WScript.Echo("----------------------");
}
function getFileExt(file_path) {
    var dx=file_path.lastIndexOf("\\"), ret;
    if(dx==-1) dx=file_path.lastIndexOf("/");
    ret=file_path.substring(dx+1);
    return (dx=ret.indexOf("."))==-1?"":("."+ret.substring(dx+1));
}

Сохраните его как NUMERIC_RENAME_ALL.BAT в месте, куда легко добраться.

Выполнение этого в обычном пакетном файле было бы затруднительным, потому что cmd.exe терпит неудачу при установке переменной внутри петель. Вот почему мы используем Batch \ WSH Hybrid файл для этого (это объявлено в первых 5 строках скрипта). Вероятно, довольно простой способ сделать это - оболочка питания.


0
2017-11-14 05:47



Теперь страница Gist была обновлена, чтобы поддерживать использование регулярных выражений, чтобы выбирать файлы, которые нужно переименовать, а не всегда переименовывать их все. - krowe


Это было протестировано в Windows 7 Professional. Никакой проверки ошибок не производится. Он переименовывает файлы в текущем каталоге, поэтому сценарий должен быть где-то на вашем пути.

@echo off
set /p start=Please enter the starting control number: 

setlocal enableDelayedExpansion

for /r %%g in (*.pdf) do (call :RenameIt %%g)
goto :eof
goto :exit

:RenameIt
echo Renaming "%~nx1" to !start!%~x1
ren "%~nx1" !start!%~x1
set /a start+=1
goto :eof

:exit
exit /b

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


0
2017-11-15 00:09





@echo off
    setlocal enableextensions disabledelayedexpansion

    set /p "number=Please enter the starting control number:" || goto :eof

    for /f "delims=" %%a in ('dir /b *.pdf') do (
        setlocal enabledelayedexpansion
        for %%b in (!number!) do (
            endlocal
            echo ren "%%~fa" %%b
        )
        set /a "number+=1"
    )

Для каждого .pdf файл в текущей папке, переименуйте файл на текущий номер и увеличьте число.

Операции переименования отображаются только на консоли. Если выход правильный, удалите echo что префиксы ren команда.


0
2017-11-15 16:15





Я нашел этот вопрос, ища средства для последовательного переименования всех файлов в каждой подпапке рекурсивно, но там, где мне нужно, чтобы числа были дополнены ведущими нулями, а также были агностическими для расширения файла. Я нашел решение Вот что привело меня к окончательному решению, которое:

@echo off
setlocal enabledelayedexpansion

for /d /r %%a in (%1\*.*) do (
    set /a counter=0
    for %%b in ("%%a\*.*") do (
        set /a counter += 1
        set zcounter=0000!counter!
        set source="%%~fb"
        set target="Receipt !zcounter:~-4!%%~xb"
        echo Renaming !source! to !target!
        ren !source! !target!
    )
)

Поместите вышеуказанное в пакетный файл и вызовите передачу каталога в качестве параметра. Скрипт прокладывает до трех ведущих нулей и префиксов словом «Квитанция», но изменяется в соответствии с вашими требованиями. Этот скрипт будет отлично работать, если у вас нет подпапок, чтобы повторно вписаться. И если вам не нужны начальные нули, просто удалите set zcounterлинии и заменить zcounter:~-4 с counter,

Надеюсь, это поможет любому, кто наткнулся на эту страницу, ищет что-то подобное.


0
2018-04-16 15:05