it-swarm-ja.com

バッチファイルを使用して、入力からファイルの名前を順番に変更しますか?

私が働いている会社は請求書を処理しており、データベースに入力されたものと実際の請求書の画像を比較して、これらの請求書の正確性を定期的にチェックする必要があります。処理中にエラーを見つけたときはいつでも、データベースから請求書を削除し、画像をプロセッサに送信して、請求書を正しく再入力する必要があります。ただし、システムでグリッチが頻繁に発生し、請求書をサーバーにアップロードしてプロセッサに送信しようとすると、重複ファイルが存在すると表示されます。この問題を回避するには、各画像の名前を手動で新しい名前に変更する必要があります(制御番号のロールを使用して画像に名前を付けます)。

このプロセスを自動化して、これらのファイルの名前を順番にすばやく変更できるようにしたいと思います。バッチファイルに入力を入れて、開始制御番号を入力できるようにしたいのですが、ディレクトリ内の各追加ファイルに+1を入力して、ディレクトリ内の各ファイルの名前を順番に変更します。たとえば、次のようになります。

バッチファイルから、コントロール番号の開始を求められます。 6654821に入ります。

  • bill3210851.pdf名前が6654821に変更されました
  • imagebill654.pdf名前が6654822に変更されました
  • random_name.pdf名前が665482に変更されました
  • 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
Molly

これは、Windows 7Professionalでテストされています。いかなる種類のエラーチェックも実行されません。現在のディレクトリ内のファイルの名前が変更されるため、スクリプトはパスのどこかにあるはずです。

@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

お役に立てば幸いです。

1
JSanchez

この質問は、各サブフォルダー内のすべてのファイルの名前を再帰的に順番に変更する方法を探していたときに見つかりましたが、番号に先行ゼロを埋め込み、ファイル拡張子に依存しないようにする必要がありました。私は解決策を見つけました ここ それは私を最終的な解決策に導きました:

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

上記をバッチファイルに入れ、ディレクトリをパラメータとして渡して呼び出します。スクリプトには、最大3つの先行ゼロと「領収書」という単語の接頭辞が埋め込まれますが、要件に応じて変更されます。このスクリプトは、再帰するサブフォルダーがない場合にも正常に機能します。また、先行ゼロが必要ない場合は、set zcounter行を削除し、zcounter:~-4counterに置き換えます。

これが、似たようなものを探しているこのページを見つけた人に役立つことを願っています。

0
Neo
@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
MC ND

このバッチスクリプトを作成して、 Gist Repo に配置しました。 Windows ScriptingHostへのアクセスが必要です。これがファイルです:

@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行で宣言されています)。これを行うには、おそらくPowerShellもかなり簡単な方法があります。

0
krowe