Renomeia os arquivos sequencialmente da entrada usando o arquivo de lote?

2

A empresa que eu trabalho para contas de processos, e eu regularmente tenho que verificar essas contas para a precisão, comparando o que foi digitado no banco de dados contra a imagem da conta real. Sempre que encontrar um erro no processamento, preciso excluir a conta do banco de dados e enviar a imagem a um processador para inserir novamente a fatura corretamente. No entanto, nosso sistema frequentemente encontra uma falha em que, se eu tentar enviar a conta para o servidor que a recebe para o processador, ela diz que existe um arquivo duplicado. Para contornar esse problema, tenho que renomear manualmente cada imagem com um novo nome (usamos rolos de números de controle para nomear nossas imagens).

Eu gostaria de automatizar esse processo para que eu possa renomear esses arquivos rapidamente em ordem seqüencial. Eu gostaria que meu arquivo batch tivesse uma entrada para que eu pudesse inserir o número de controle inicial e renomear cada arquivo no diretório em ordem seqüencial, começando com o número de controle que eu digito +1 para cada arquivo adicional no diretório, por exemplo, seria assim:

O arquivo em lote me pede para iniciar o controle #. Eu entro em 6654821.

  • bill3210851.pdf renomeado para 6654821
  • imagebill654.pdf renomeado para 6654822
  • random_name.pdf renomeado para 6654823
  • billerror.pdf renomeado para 6654824
  • sendtomanual.pdf renomeado para 6654825

O nome original do arquivo não é relevante, eles não precisam permanecer em nenhuma ordem específica, desde que sejam renomeados seqüencialmente.

Até agora, o que eu tenho é isso:

@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

Obviamente, isso não se refere a renomear os arquivos sequencialmente. Eu estou meio preso aqui.

    
por Molly 14.11.2014 / 02:58

4 respostas

0

Eu escrevi este script em lote e o coloquei no meu Gist Repo . Requer acesso ao Windows Scripting Host. Aqui está o arquivo:

@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));
}

Salve-o como NUMERIC_RENAME_ALL.BAT em um local de fácil acesso.

Fazer isso em um arquivo de lote simples seria difícil porque o cmd.exe falha ao definir a variável dentro de loops. É por isso que estamos usando um arquivo Batch \ WSH Hybrid para fazer isso (isso é declarado nas primeiras 5 linhas do script). Há provavelmente uma maneira bastante fácil de fazer isso é poder shell também.

    
por 14.11.2014 / 06:47
0

Isso foi testado no Windows 7 Professional. Nenhuma verificação de erros de qualquer tipo é executada. Ele renomeia os arquivos no diretório atual, portanto, o script deve estar em algum lugar no caminho.

@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

Espero que ajude!

    
por 15.11.2014 / 01:09
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"
    )

Para cada arquivo .pdf na pasta atual, renomeie o arquivo para o número atual e aumente o número.

As operações de renomeação só são ecoadas para o console. Se a saída estiver correta, remova o echo que prefixará o comando ren .

    
por 15.11.2014 / 17:15
0

Eu encontrei essa pergunta enquanto procurava por um meio de renomear sequencialmente todos os arquivos em cada subpasta recursivamente, mas onde eu exigia que os números fossem preenchidos com zeros à esquerda, e também para ser agnóstico para a extensão do arquivo. Eu encontrei uma solução aqui que me levou à solução final que é:

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

Coloque o acima em um arquivo em lote e chame passando um diretório como um parâmetro. O script pads com até três zeros e prefixos com a palavra "Recibo", mas mudam de acordo com seus requisitos. Esse script também funcionará bem se você não tiver subpastas para as quais recorrer. E se você não quiser zeros à esquerda, apenas remova a linha set zcounter e substitua zcounter:~-4 por counter .

Espero que isso ajude alguém a encontrar essa página em busca de algo parecido.

    
por 16.04.2017 / 17:05