2

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

Я хотел бы автоматизировать этот процесс, чтобы я мог быстро переименовать эти файлы в последовательном порядке. Я хотел бы, чтобы мой командный файл имел ввод, чтобы я мог ввести начальный контрольный номер, и он будет переименовывать каждый файл в каталоге в последовательном порядке, начиная с контрольного номера, который я вводил +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

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

4 ответа4

0

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

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

Это было проверено в 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

Я написал этот пакетный сценарий и поместил его в мой 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 для этого (это объявлено в этих первых 5 строках скрипта). Вероятно, есть довольно простой способ сделать это - также Power Shell.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .